一、背景
GraphRAG-2.x默认支持的 vector_store 只有 3 种:lancedb(默认)、azure_ai_search、cosmosdb,目前微软官方没有支持Milvus向量数据库。为了整合milvus,需要对源码进行调整。
本文不在赘述:如何下载GraphRAG工厂及其初始化?如何整合GraphRAG和阿里百炼DashScopr?如何下载milvus工程及使用方法?
详细可参考:
https://github.com/microsoft/graphrag 微软GraphRAG项目地址
https://milvus.io/docs/zh/v2.5.x/quickstart.md milvus向量库官方说明文档
二、变更方案
整体思路:
1.新增Milvus/MilvusLite adapter挂载到GraphRAG的VectorStoreFactory,继承向量存储基类(BaseVectorStore)
2.在factory里注册一个新的type:milvus
3.支持配置变更setting.yaml
1.vector_store枚举新增
python
# 目录:graphrag/config/enums.py模块
class VectorStoreType(str, Enum):
"""The supported vector store types."""
LanceDB = "lancedb"
AzureAISearch = "azure_ai_search"
CosmosDB = "cosmosdb"
# 新增 milvus 配置
Milvus = "milvus"
2.扩展milvus_store
python
from __future__ import annotations
from typing import Any, List
import logging
from pymilvus import MilvusClient, DataType
from pymilvus.milvus_client.index import IndexParams # ⚠️ 注意:从子模块导入
from graphrag.config.models.vector_store_schema_config import VectorStoreSchemaConfig
from graphrag.data_model.types import TextEmbedder
from graphrag.vector_stores.base import (
BaseVectorStore,
VectorStoreDocument,
VectorStoreSearchResult,
)
logger = logging.getLogger(__name__)
class MilvusVectorStore(BaseVectorStore):
"""Milvus / Milvus Lite vector storage implementation for Graphrag.
支持:
- Milvus Lite: url: "./milvus_lite.db"
- Milvus Standalone: url: "http://localhost:19530"
"""
def __init__(
self,
vector_store_schema_config: VectorStoreSchemaConfig,
**kwargs: Any,
) -> None:
super().__init__(
vector_store_schema_config=vector_store_schema_config,
**kwargs,
)
self._client: MilvusClient | None = None
self._collection_name: str | None = None
self._is_lite: bool = False
# 如果没配置 vector_size,默认 1536(你当前 embedding 维度)
if self.vector_size is None:
self.vector_size = 1536
# =======================
# 连接 & 集合初始化
# =======================
def connect(self, **kwargs: Any) -> None:
"""Connect to Milvus / Milvus Lite."""
# 1. 解析 uri
uri: str = (
kwargs.get("url")
or self.kwargs.get("url")
or kwargs.get("uri")
or self.kwargs.get("uri")
)
if not uri:
uri = "./milvus_lite.db"
# 判断是否是 Lite
self._is_lite = uri.endswith(".db")
# 2. 认证 & 数据库
user: str | None = kwargs.get("user") or self.kwargs.get("user")
password: str | None = kwargs.get("password") or self.kwargs.get("password")
token: str | None = kwargs.get("token") or self.kwargs.get("token")
db_name: str | None = (
kwargs.get("database_name")
or self.kwargs.get("database_name")
or "default"
)
if not token and user and password:
token = f"{user}:{password}"
client_kwargs: dict[str, Any] = {"uri": uri}
if token:
client_kwargs["token"] = token
if db_name:
client_kwargs["db_name"] = db_name
self._client = MilvusClient(**client_kwargs)
# 3. collection_name(统一用 index_name/container_name)
collection_name: str = (
self.index_name
or kwargs.get("collection_name")
or self.kwargs.get("container_name")
or self.kwargs.get("collection_name")
or "default"
)
collection_name = collection_name.replace("-", "_")
self._collection_name = collection_name
# overwrite: bool = bool(
# kwargs.get("overwrite", self.kwargs.get("overwrite", False))
# )
#
# # 4. 覆盖模式:先删旧集合
# if overwrite and self._client.has_collection(collection_name=collection_name):
# self._client.drop_collection(collection_name=collection_name)
# 5. 不存在就创建集合(自定义 schema)
if not self._client.has_collection(collection_name=collection_name):
schema = MilvusClient.create_schema(enable_dynamic_field=False)
# id 字段:VARCHAR 主键
schema.add_field(
field_name=self.id_field,
datatype=DataType.VARCHAR,
is_primary=True,
max_length=512,
)
# 向量字段
schema.add_field(
field_name=self.vector_field,
datatype=DataType.FLOAT_VECTOR,
dim=self.vector_size,
)
# 原文字段
schema.add_field(
field_name=self.text_field,
datatype=DataType.VARCHAR,
max_length=4096,
)
# attributes JSON
schema.add_field(
field_name=self.attributes_field,
datatype=DataType.JSON,
)
self._client.create_collection(
collection_name=collection_name,
schema=schema,
)
# 6. 确保索引存在(使用 IndexParams)
self._ensure_index()
# 7. 加载集合
try:
self._client.load_collection(collection_name)
except Exception:
# Lite 模式下可能已经自动加载,忽略错误
pass
# BaseVectorStore 里用这个表示"集合"
self.document_collection = self._collection_name
# =======================
# 确保索引
# =======================
def _ensure_index(self) -> None:
"""对向量字段创建索引(Lite: FLAT,Standalone: HNSW)"""
assert self._client is not None
assert self._collection_name is not None
# 使用 IndexParams(注意:必须是这个类型)
index_params = IndexParams()
if self._is_lite:
# Lite 性能要求不高,直接 FLAT,也需要先建 index
index_params.add_index(
field_name=self.vector_field,
index_type="FLAT",
metric_type="COSINE",
)
else:
# Standalone 推荐用 HNSW / IVF_FLAT 等
index_params.add_index(
field_name=self.vector_field,
index_type="HNSW",
metric_type="COSINE",
params={
"M": 16,
"efConstruction": 64,
},
)
try:
# MilvusClient 的轻量 API:必须传 IndexParams
self._client.create_index(
collection_name=self._collection_name,
index_params=index_params,
)
except Exception as e:
# 如果已经建过索引,会报 already 之类,忽略
if "already" not in str(e).lower():
raise e
# =======================
# 写入向量
# =======================
def load_documents(
self,
documents: list[VectorStoreDocument],
overwrite: bool = True,
) -> None:
"""Load documents into Milvus collection."""
if self._client is None or self._collection_name is None:
self.connect(**self.kwargs)
assert self._client is not None
assert self._collection_name is not None
# ✅ 只有在索引阶段、且是首批写入时才会传 overwrite=True
if overwrite:
# 如果集合已存在,删除重建
if self._client.has_collection(collection_name=self._collection_name):
# print(f"🟧 [DEBUG] overwrite=True,删除已有集合:{self._collection_name}")
logging.debug(f"🟧 [DEBUG] overwrite=True,删除已有集合:{self._collection_name}")
self._client.drop_collection(collection_name=self._collection_name)
# 重建 schema & index
schema = MilvusClient.create_schema(enable_dynamic_field=False)
schema.add_field(
field_name=self.id_field,
datatype=DataType.VARCHAR,
is_primary=True,
max_length=512,
)
schema.add_field(
field_name=self.vector_field,
datatype=DataType.FLOAT_VECTOR,
dim=self.vector_size,
)
schema.add_field(
field_name=self.text_field,
datatype=DataType.VARCHAR,
max_length=4096,
)
schema.add_field(
field_name=self.attributes_field,
datatype=DataType.JSON,
)
self._client.create_collection(
collection_name=self._collection_name,
schema=schema,
)
# 重新建索引
self._ensure_index()
self._client.load_collection(self._collection_name)
# 下面保持原来的插入逻辑
rows: list[dict[str, Any]] = []
for doc in documents:
if not doc.vector:
continue
# 动态修正 vector_size(以防 config 缺失)
if self.vector_size is None:
self.vector_size = len(doc.vector)
if len(doc.vector) != self.vector_size:
# 维度不匹配直接跳过
continue
rows.append(
{
self.id_field: str(doc.id),
self.vector_field: list(doc.vector),
self.text_field: doc.text or "",
self.attributes_field: doc.attributes or {},
}
)
if not rows:
return
self._client.insert(
collection_name=self._collection_name,
data=rows,
)
# =======================
# 按 ID 过滤
# =======================
def filter_by_id(self, include_ids: list[str] | list[int]) -> Any:
"""Build a Milvus filter expression to filter by id."""
if not include_ids:
self.query_filter = None
return self.query_filter
id_list = ", ".join(f"'{str(i)}'" for i in include_ids)
self.query_filter = f"{self.id_field} in [{id_list}]"
return self.query_filter
# =======================
# 向量相似度搜索
# =======================
def similarity_search_by_vector(
self,
query_embedding: list[float],
k: int = 10,
**kwargs: Any,
) -> list[VectorStoreSearchResult]:
# ================================
# 0. 基础信息打印 ------ 是否连上 Milvus?
# ================================
if self._client is None or self._collection_name is None:
logging.debug("[DEBUG] client 或 collection 不存在,重新连接中...")
self.connect(**self.kwargs)
client = self._client
collection = self._collection_name
logging.debug("[DEBUG] Using collection = %s", collection)
logging.debug("[DEBUG] Query embedding dim = %s", len(query_embedding))
# ================================
# 1. Index 信息检查
# ================================
try:
index_info = client.describe_index(collection, self.vector_field)
metric_type = index_info.get("metric_type", "COSINE")
index_params = index_info.get("index_parameter", {})
params = index_params if isinstance(index_params, dict) else {}
except Exception as e:
metric_type = "COSINE"
params = {}
if self._is_lite:
params = {}
logging.debug("[DEBUG] metric_type = %s", metric_type)
logging.debug(f"🟦 [DEBUG] params = {params}")
# ================================
# 2. 构造 search_params
# ================================
search_params = {
"metric_type": metric_type,
"params": params,
}
logging.debug("[DEBUG] search_params = %s", search_params)
# ================================
# 3. 过滤表达式
# ================================
filter_expr = self.query_filter or ""
logging.debug("[DEBUG] filter_expr = '%s'", filter_expr)
# ================================
# 4. 正式调用 MilvusClient.search
# ================================
# print("\n🟥 [DEBUG] 即将调用 MilvusClient.search...")
# print(f"🟥 collection={collection}")
# print(f"🟥 anns_field={self.vector_field}")
# print(f"🟥 limit={k}")
stats = client.get_collection_stats(collection)
# print(f"🟦 [DEBUG] collection_stats_in_search = {stats}")
try:
results = client.search(
collection_name=collection,
data=[query_embedding],
filter=filter_expr,
limit=k,
output_fields=[
self.id_field,
self.text_field,
self.attributes_field,
],
search_params=search_params,
anns_field=self.vector_field,
)
except Exception as e:
raise e
logging.info("[DEBUG] Milvus 返回原始结果结构:%s", results)
hits = results[0] if results else []
logging.info("[DEBUG] 命中条数 = %s", len(hits))
# ================================
# 5. 打印每条 hit
# ================================
# for i, h in enumerate(hits):
# print("\n--------------------------------------")
# print(f"Hit #{i + 1}")
# print("id =", h.get(self.id_field))
# print("distance =", h.get("distance"))
# print("score = ", 1 - float(h.get("distance", 0)))
# print("text_preview =", str(h.get(self.text_field))[:120])
# print("--------------------------------------")
# ================================
# 6. 封装返回
# ================================
out: list[VectorStoreSearchResult] = []
for h in hits:
distance = float(h.get("distance", 0.0))
doc = VectorStoreDocument(
id=h.get(self.id_field),
text=h.get(self.text_field),
vector=None,
attributes=h.get(self.attributes_field) or {},
)
out.append(
VectorStoreSearchResult(
document=doc,
score=1 - distance,
)
)
return out
# =======================
# 文本相似度搜索
# =======================
def similarity_search_by_text(
self,
text: str,
text_embedder: TextEmbedder,
k: int = 10,
**kwargs: Any,
) -> list[VectorStoreSearchResult]:
"""Perform ANN search by text (embed first, then search)."""
embedding = text_embedder(text)
# 🔥🔥🔥 关键日志(定位模型是否工作)
# print("===== [DEBUG] Query Text =", text)
# print("===== [DEBUG] Embedding len =", len(embedding) if embedding else None)
# print("===== [DEBUG] Embedding preview =", embedding[:8] if embedding else None)
logging.info("[DEBUG] Query Text = %s", text)
logging.info(
"[DEBUG] Embedding len = %s",
len(embedding) if embedding else None,
)
if not embedding:
return []
return self.similarity_search_by_vector(embedding, k=k, **kwargs)
# =======================
# 根据 ID 精确查询
# =======================
def search_by_id(self, id: str) -> VectorStoreDocument:
"""Search for a document by id."""
if self._client is None or self._collection_name is None:
self.connect(**self.kwargs)
assert self._client is not None
assert self._collection_name is not None
res = self._client.query(
collection_name=self._collection_name,
filter=f"{self.id_field} == '{id}'",
output_fields=[
self.id_field,
self.text_field,
self.vector_field,
self.attributes_field,
],
)
if not res:
return VectorStoreDocument(id=id, text=None, vector=None, attributes={})
row = res[0]
return VectorStoreDocument(
id=row.get(self.id_field),
text=row.get(self.text_field),
vector=row.get(self.vector_field),
attributes=row.get(self.attributes_field) or {},
)
3.配置文件变更
python
### This config file contains required core defaults that must be set, along with a handful of common optional settings.
### For a full list of available settings, see https://microsoft.github.io/graphrag/config/yaml/
### LLM settings ###
## There are a number of settings to tune the threading and token limits for LLM calls - check the docs.
models:
default_chat_model:
type: chat
model_provider: openai
auth_type: api_key # or azure_managed_identity
api_key: ${GRAPHRAG_API_KEY} # set this in the generated .env file, or remove if managed identity
model: qwen3-max
# api_base: https://<instance>.openai.azure.com
# api_version: 2024-05-01-preview
api_base: https://dashscope.aliyuncs.com/compatible-mode/v1
model_supports_json: false # recommended if this is available for your model.
concurrent_requests: 25
async_mode: threaded # or asyncio
retry_strategy: exponential_backoff
max_retries: 10
tokens_per_minute: null
requests_per_minute: null
default_embedding_model:
type: embedding
model_provider: openai
auth_type: api_key
api_key: ${GRAPHRAG_API_KEY}
api_base: https://dashscope.aliyuncs.com/compatible-mode/v1
model: text-embedding-v2
# api_base: https://<instance>.openai.azure.com
# api_version: 2024-05-01-preview
concurrent_requests: 25
async_mode: threaded # or asyncio
retry_strategy: exponential_backoff
max_retries: 10
tokens_per_minute: null
requests_per_minute: null
### Input settings ###
input:
storage:
type: file # or blob
base_dir: "input"
file_type: text # [csv, text, json]
chunks:
size: 1200
overlap: 100
group_by_columns: [id]
### Output/storage settings ###
## If blob storage is specified in the following four sections,
## connection_string and container_name must be provided
output:
type: file # [file, blob, cosmosdb]
base_dir: "output"
cache:
type: file # [file, blob, cosmosdb]
base_dir: "cache"
reporting:
type: file # [file, blob]
base_dir: "logs"
vector_store:
default_vector_store:
type: milvus
url: "./output/milvus_lite.db"
container_name: "graphrag_vectors"
overwrite: true
### Workflow settings ###
embed_text:
batch_size: 10 #阿里词嵌入模型批次要求
model_id: default_embedding_model
vector_store_id: default_vector_store
names:
- text_unit.text
- community.full_content
- entity.description
extract_graph:
model_id: default_chat_model
prompt: "prompts/extract_graph.txt"
entity_types: [organization,person,geo,event]
max_gleanings: 1
summarize_descriptions:
model_id: default_chat_model
prompt: "prompts/summarize_descriptions.txt"
max_length: 500
extract_graph_nlp:
text_analyzer:
extractor_type: regex_english # [regex_english, syntactic_parser, cfg]
async_mode: threaded # or asyncio
cluster_graph:
max_cluster_size: 10
extract_claims:
enabled: false
model_id: default_chat_model
prompt: "prompts/extract_claims.txt"
description: "Any claims or facts that could be relevant to information discovery."
max_gleanings: 1
community_reports:
model_id: default_chat_model
graph_prompt: "prompts/community_report_graph.txt"
text_prompt: "prompts/community_report_text.txt"
max_length: 2000
max_input_length: 8000
embed_graph:
enabled: false # if true, will generate node2vec embeddings for nodes
dimensions: 1536
umap:
enabled: false # if true, will generate UMAP embeddings for nodes (embed_graph must also be enabled)
snapshots:
graphml: false
embeddings: false
### Query settings ###
## The prompt locations are required here, but each search method has a number of optional knobs that can be tuned.
## See the config docs: https://microsoft.github.io/graphrag/config/yaml/#query
local_search:
chat_model_id: default_chat_model
embedding_model_id: default_embedding_model
prompt: "prompts/local_search_system_prompt.txt"
global_search:
chat_model_id: default_chat_model
map_prompt: "prompts/global_search_map_system_prompt.txt"
reduce_prompt: "prompts/global_search_reduce_system_prompt.txt"
knowledge_prompt: "prompts/global_search_knowledge_system_prompt.txt"
drift_search:
chat_model_id: default_chat_model
embedding_model_id: default_embedding_model
prompt: "prompts/drift_search_system_prompt.txt"
reduce_prompt: "prompts/drift_search_reduce_prompt.txt"
basic_search:
chat_model_id: default_chat_model
embedding_model_id: default_embedding_model
prompt: "prompts/basic_search_system_prompt.txt"
三、构建方法
1.重载graphrag包
bash
# 卸载旧包
pip uninstall graphrag -y
# 重新加载变更后的包 需要在根目录下
pip install -e .
2.查询vector_store支持列表
bash
# 根目录下
python - << 'EOF'
from graphrag.vector_stores.factory import VectorStoreFactory
print("Supported vector stores:", VectorStoreFactory.get_vector_store_types())
EOF
# 出现打印结果,则milvus配置成功
Supported vector stores: ['lancedb', 'azure_ai_search', 'cosmosdb', 'milvus']
3.构建向量索引
bash
# 进入初始化目录
graphrag index --root .
四、查询方法
1.local-查询
bash
graphrag query --method local --query "失效模式为"F086-剪切断裂"所对应的征兆有哪些?"
(milvus_huoshan) root@iv-ye13insw00wh2ypeqgva:~/code/graphrag_milvus_2.7.0/rag_milvus# graphrag query --method local --query "失效模式为"F086-剪切断裂"所对应的征兆有哪些?"
/root/miniconda3/envs/milvus_huoshan/lib/python3.11/site-packages/milvus_lite/__init__.py:15: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.
from pkg_resources import DistributionNotFound, get_distribution
# 失效模式"F086-剪切断裂"对应的征兆分析
失效模式"F086-剪切断裂"是指泵联轴器在长时间扭转疲劳作用下发生的剪切断裂,属于高风险机械故障,可能引发反应堆自动或手动停堆,并影响余热排出能力。为实现对该失效模式的早期识别与预警,专家团队(课题组)已系统定义了多个可观测征兆,涵盖机械、电气和热工参数。
## 主要征兆列表
根据提供的资料,失效模式"F086-剪切断裂"共对应**8个明确征兆**(征兆1至征兆8),具体如下:
- **征兆1**:泵转速单调急剧下降 ------ 2小时内下降1000 r/min(阈值:1000转/分),由传感器 PCR001-S-E-004 监测,权重高(0.5--1)[Data: Sources (9)]。
- **征兆2**:泵转速低1 ------ 转速低于1000 r/min,同样由 PCR001-S-E-004 监测,权重高 [Data: Sources (9)]。
- **征兆3**:下半联轴器与端环的距离(270度)高1 ------ 超过拆前值,由 PCR001-D-11.1-B-004 监测,权重低 [Data: Sources (9)]。
- **征兆4**:下半联轴器与端环的距离(180度)高1 ------ 超过拆前值,由 PCR001-D-11.1-B-003 监测,权重低 [Data: Sources (9)]。
- **征兆5**:下半联轴器与端环的距离(0度)高1 ------ 超过拆前值,由 PCR001-D-11.1-B-001 监测,权重低 [Data: Sources (9)]。
- **征兆6**:主泵电机电流低1 ------ 电流低于580 A,由 PCR001-C-W-002 监测,权重高 [Data: Sources (10)]。
- **征兆7**:主泵电机电流单调急剧下降 ------ 2小时内下降200 A(阈值:200 A),由 PCR001-C-W-002 监测,权重高 [Data: Sources (10)]。
- **征兆8**:下半联轴器与端环的距离(90度)高1 ------ 超过拆前值,由 PCR001-D-11.1-B-002 监测,权重低 [Data: Sources (10)]。
这些征兆可分为两类:
- **高权重征兆**(征兆1、2、6、7):主要反映转速和电流的异常变化,具有强诊断价值;
- **低权重征兆**(征兆3--5、8):反映联轴器几何位置偏移,通常作为辅助判断依据。
## 征兆与诊断规则的关联
上述征兆被整合进四条诊断规则(规则1至规则4,对应规则编号 H-00000597-001-01 至 H-00000597-001-04),每条规则组合多个征兆以提高诊断可靠性。例如:
- **规则1** 包含征兆1、7及所有四个方向的联轴器-端环距离异常(征兆3--5、8);
- **规则4** 则基于征兆2、6及全部距离类征兆 [Data: Sources (10); Entities (91, 93, 94); Relationships (102, 105, 108, 111)]。
这种多征兆融合策略有助于在不同运行工况下准确识别"F086-剪切断裂"的早期迹象,从而支持预测性维护和安全干预。
综上所述,失效模式"F086-剪切断裂"共关联8个具体征兆,覆盖转速、电流和机械位移等多个维度,构成了一个结构化的故障监测体系 [Data: Sources (9, 10); Entities (85, 89); Relationships (90, 91, 92, 93, 94, +more)].
可通过打开print注释查看索引是否生效。
2.global-查询
bash
graphrag query --method global --query "失效模式为"F086-剪切断裂"所对应的征兆有哪些?"
(milvus_huoshan) root@iv-ye13insw00wh2ypeqgva:~/code/graphrag_milvus_2.7.0/rag_milvus# graphrag query --method global --query "失效模式为"F086-剪切断裂"所对应的征兆有哪些?"
# 失效模式"F086-剪切断裂"对应的征兆分析
失效模式"F086-剪切断裂"是一种严重的机械故障,通常由扭转疲劳和环境暴露引起,可能导致反应堆跳闸或激活安全系统,并最终引发系统级故障"F032-无输出",表明扭矩传递已完全中断 [Data: Reports (21)]。为有效识别该失效模式,多个诊断规则和运行参数被用于监测其典型征兆。这些征兆主要集中在电气、旋转和机械三个领域,并通常以多参数融合的方式共同判断,以提高诊断准确性并减少误报 [Data: Reports (7, 31, 41)]。
## 电气域征兆:主泵电机电流异常
主泵电机电流异常是"F086-剪切断裂"的关键电气征兆之一。具体表现为电流偏低或出现急剧下降。该异常通常与机械断裂导致的负载突变相关,是诊断规则中明确纳入的重要指标。例如,诊断规则 H-00000597-001-02 和 H-00000597-001-03 特别指出,电机电流急剧下降若与多角度联轴器-端环距离升高同时出现,可作为剪切断裂的复合征兆 [Data: Reports (7, 31, 40, 41)]。
## 旋转域征兆:泵转速异常
泵转速(RPM)异常是另一项关键征兆,包括转速快速下降或整体偏低。这一现象通常反映扭矩传递中断或机械连接失效,与剪切断裂的突发性特征高度一致。诊断规则 H-00000597-001-02 明确将泵转速偏低列为 F086-剪切断裂的识别依据之一 [Data: Reports (7, 31, 40, 41)]。
## 机械域征兆:联轴器与端环距离异常
机械对中状态的变化是识别剪切断裂最直接的征兆之一。具体表现为下半联轴器与端环在多个角度(0°、90°、180°、270°)的距离出现高值(high1)。诊断规则 H-00000597-001-04 要求所有四个角度均出现异常,方可作为有效判断依据 [Data: Reports (7,些对中异常通常由联轴器断裂后机械结构失稳引起。
## 辅助与前兆征兆:轴位移异常
除上述核心征兆外,主泵轴位移X的异常也可作为辅助或前兆指标。例如,"主泵轴位移X高1"(即主泵轴位移X超过高阈值)出现在规则 H-00000630-001-03 中,用于检测与联轴器断裂相关的机械异常 [Data: Reports (19)]。此外,规则 H-00000630-001-02(19)]。
## 多参数融合诊断策略
为提升诊断可靠性,相关规则普遍采用多参数融合方法。例如,规则 H-00000597-001-01 不仅关注联轴器-端环距离异常,还结合电流和转速(RPM)趋势等运行遥测数据 [Data: Reports (42)]。类似地,规则 H-00000597-001-02 和 H-00000597-001-03 强调机制有助于排除单一参数波动引起的误报,确保诊断结果的准确性。
## 其他相关说明
值得注意的是,虽然"征兆1"被直接关联至失效模式"F086-剪切断裂" [Data: Reports (25)],但其具体物理含义未在现有资料中明确说明。此外,"征兆6"虽出现在与 F086 相同的分析社区中,但当前数据未提供其与剪切断裂的直接对应关系 [Data: Reports (25)],因此不能作为有效征兆纳入判断。
综上所述,失效模式"F086-剪切断裂"的识别依赖于电流、转速和机械对中状态等多维度参数的协同异常,且需满足特定诊断规则中的组合条件,方可确认故障发生。