--- layout: default title: "查询时可解释性" parent: "Chinese (Beta)" --- # 查询时可解释性 > **Beta Translation:** This document was translated via Machine Learning and as such may not be 100% accurate. All non-English languages are currently classified as Beta. ## 状态 已实现 ## 概述 本规范描述了 GraphRAG 如何记录和在查询执行期间传递可解释性数据。目标是实现完全的可追溯性:从最终答案,再到选择的边,最后到源文档。 查询时可解释性捕获了 GraphRAG 管道在推理过程中的行为。它与提取时的来源信息相关联,该信息记录了知识图谱事实的来源。 ## 术语 | 术语 | 定义 | |---|---| | **可解释性** | 结果的推导方式 | | **会话** | 单个 GraphRAG 查询执行 | | **边选择** | 使用 LLM 进行相关边的选择,并提供推理 | | **来源链** | 从边 → 块 → 页面 → 文档 | ## 架构 ### 可解释性流程 ``` GraphRAG 查询 │ ├─► 会话活动 │ └─► 查询文本,时间戳 │ ├─► 检索实体 │ └─► 从子图检索的所有边 │ ├─► 选择实体 │ └─► 使用 LLM 推理选择的边 │ └─► 每条边都与提取来源关联 │ └─► 答案实体 └─► 指向合成响应 (在库员中) ``` ### 两阶段 GraphRAG 管道 1. **边选择**:LLM 从子图中选择相关的边,并提供每个边的推理 2. **合成**:LLM 从选择的边生成答案 这种分离实现了可解释性:我们知道哪些边贡献了结果。 ### 存储 - 可解释性三元组存储在可配置的集合中 (默认:`explainability`) - 使用 PROV-O 语义网进行来源关系 - 使用 RDF-star 重新表达进行边引用 - 答案内容存储在库员服务中 (不在内联位置 - 过于庞大) ### 实时流 可解释性事件在查询执行时流式传输到客户端: 1. 创建会话 → 发出事件 2. 检索边 → 发出事件 3. 使用推理选择边 → 发出事件 4. 答案合成 → 发出事件 客户端接收 `explain_id` 和 `explain_collection` 以获取完整详细信息。 ## URI 结构 所有 URI 使用 `urn:trustgraph:` 命名空间和 UUID: | 实体 | URI 模式 | |---|---| | 会话 | `urn:trustgraph:session:{uuid}` | | 检索 | `urn:trustgraph:prov:retrieval:{uuid}` | | 选择 | `urn:trustgraph:prov:selection:{uuid}` | | 答案 | `urn:trustgraph:prov:answer:{uuid}` | | 边选择 | `urn:trustgraph:prov:edge:{uuid}:{index}` | ## RDF 模型 (PROV-O) ### 会话活动 ```turtle a prov:Activity ; rdfs:label "GraphRAG 查询会话" ; prov:startedAtTime "2024-01-15T10:30:00Z" ; tg:query "What was the War on Terror?" . ``` ### 检索实体 ```turtle a prov:Entity ; rdfs:label "检索的边" ; prov:wasGeneratedBy ; tg:edgeCount 50 . ``` ### 选择实体 ```turtle a prov:Entity ; rdfs:label "选择的边" ; prov:wasDerivedFrom ; tg:selectedEdge ; tg:selectedEdge . tg:edge <<

>> ; tg:reasoning "This edge establishes the key relationship..." . ``` ### 答案实体 ```turtle a prov:Entity ; rdfs:label "GraphRAG 答案" ; prov:wasDerivedFrom ; tg:document . ``` `tg:document` 引用库员服务中存储的答案。 ## 名称空间常量 定义在 `trustgraph-base/trustgraph/provenance/namespaces.py`: | 常量 | URI | |---|---| | `TG_QUERY` | `https://trustgraph.ai/ns/query` | | `TG_EDGE_COUNT` | `https://trustgraph.ai/ns/edgeCount` | | `TG_SELECTED_EDGE` | `https://trustgraph.ai/ns/selectedEdge` | | `TG_EDGE` | `https://trustgraph.ai/ns/edge` | | `TG_REASONING` | `https://trustgraph.ai/ns/reasoning` | | `TG_CONTENT` | `https://trustgraph.ai/ns/content` | | `TG_DOCUMENT` | `https://trustgraph.ai/ns/document` | ## GraphRagResponse 模式 ```python @dataclass class GraphRagResponse: error: None | None = None response: str = "" end_of_stream: bool = False explain_id: str | None = None explain_collection: str | None = None message_type: str = "" # "chunk" 或 "explain" end_of_session: bool = False ``` ### 消息类型 | message_type | 目的 | |---|---| | `chunk` | 响应文本 (流式或最终) | | `explain` | 可解释性事件,包含 IRI 引用 | ### 会话生命周期 1. 多个 `explain` 消息 (会话、检索、选择、答案) 2. 多个 `chunk` 消息 (流式响应) 3. 最终的 `chunk`,`end_of_session=True` ## 边选择格式 LLM 返回 JSONL 格式的边: ```jsonl {"id": "edge-hash-1", "reasoning": "This edge shows the key relationship..."} {"id": "edge-hash-2", "reasoning": "Provides supporting evidence..."} ``` `id` 是使用 `edge_id()` 计算的 `(labeled_s, labeled_p, labeled_o)` 的哈希值。 ## URI 保留 ### 问题 GraphRAG 向 LLM 显示了人类可读的标签,但为了可追溯性,需要原始 URI。 ### 解决方案 `get_labelgraph()` 返回: - `labeled_edges`: 包含 `(label_s, label_p, label_o)` 的列表,供 LLM 使用 - `uri_map`: 将 `edge_id(labels)` 映射到 `(uri_s, uri_p, uri_o)` 的字典 在存储可解释性数据时,使用 `uri_map` 中的 URI。 ## 来源追踪 ### 从边到源 可以追踪选择的边: 1. 查询包含的子图:`?subgraph tg:contains <>` 2. 遵循 `prov:wasDerivedFrom` 链,找到根文档 3. 每个步骤中的链:块 → 页面 → 文档 ### 支持 Cassandra 引用 Cassandra 查询服务支持引用: ```python # 在 get_term_value() 中: elif term.type == TRIPLE: return serialize_triple(term.triple) ``` 这允许查询: ``` ?subgraph tg:contains <> ``` ## CLI 使用 ```bash tg-invoke-graph-rag --explainable -q "What was the War on Terror?" ``` ## 参考 - PROV-O (W3C Provenance Ontology): https://www.w3.org/TR/prov-o/ - RDF-star: https://w3c.github.io/rdf-star/ - 提取时的来源信息: `docs/tech-specs/extraction-time-provenance.md`