agentic_huge_data_base / wiki
页面 Graphiti · 6.3 提示词库与模板·DeepWiki 中文全文译文

6.3 · 提示词库与模板(Prompt Library and Templates)

时序知识图谱与动态事实记忆 · 聚焦本章的模块关系、源码依据与实现要点。

项目Graphiti 章节6.3 状态全文译文 模块图谱与关系、系统架构、测试、发布与运维、记忆与上下文
源码线索
  • graphiti_core/prompts/dedupe_edges.py
  • graphiti_core/prompts/dedupe_nodes.py
  • graphiti_core/prompts/extract_edges.py
  • graphiti_core/prompts/extract_nodes.py
  • graphiti_core/prompts/extract_nodes_and_edges.py
  • graphiti_core/prompts/lib.py
  • graphiti_core/prompts/snippets.py
  • graphiti_core/prompts/summarize_nodes.py
  • graphiti_core/prompts/summarize_sagas.py
  • graphiti_core/utils/maintenance/combined_extraction.py
模块标签
  • 图谱与关系
  • 系统架构
  • 测试、发布与运维
  • 记忆与上下文
  • 检索、召回与索引

章节正文

提示词库与模板

提示词库与模板

相关源文件

本章引用的主要源码文件:

  • graphiti_core/prompts/dedupe_edges.py
  • graphiti_core/prompts/dedupe_nodes.py
  • graphiti_core/prompts/extract_edges.py
  • graphiti_core/prompts/extract_nodes.py
  • graphiti_core/prompts/extract_nodes_and_edges.py
  • graphiti_core/prompts/lib.py
  • graphiti_core/prompts/snippets.py
  • graphiti_core/prompts/summarize_nodes.py
  • graphiti_core/prompts/summarize_sagas.py
  • graphiti_core/utils/maintenance/combined_extraction.py
  • graphiti_core/utils/text_utils.py
  • tests/utils/test_concatenate_episodes.py

本文档描述了 Graphiti 的提示词库系统,该系统为实体提取、去重、摘要和时间操作提供了结构化的大语言模型(LLM)提示模板。提示词系统使用 Pydantic 模型进行响应校验,并支持版本化以实现迭代改进。

有关这些提示词在数据处理管线中如何使用的信息,请参见剧集处理工作流节点提取与解析边提取与解析。有关执行这些提示词的大语言模型(LLM)客户端的详细信息,请参见大语言模型(LLM)客户端架构

提示词系统架构

提示词库被组织成位于 graphiti_core/prompts/ 中的模块化文件,每个文件包含特定任务的提示函数。每个提示函数接受一个上下文字典,并返回一个适合大语言模型(LLM)执行的 Message 对象列表。中心入口点是定义在 graphiti_core/prompts/lib.py:102 中的 prompt_library 对象。

自然语言到代码实体的映射

下图将概念性的提示任务桥接到代码库中特定的 Python 函数和响应模型。

Graphiti · 自然语言到代码实体的映射 · 图 1
Graphiti · 自然语言到代码实体的映射 · 图 1

来源: graphiti_core/prompts/lib.py:87-96, graphiti_core/prompts/extract_nodes.py:28-42, graphiti_core/prompts/dedupe_nodes.py:25-38, graphiti_core/prompts/extract_edges.py:55-56, graphiti_core/prompts/dedupe_edges.py:24-32, graphiti_core/prompts/summarize_nodes.py:28-35, graphiti_core/prompts/summarize_sagas.py:26-30, graphiti_core/prompts/extract_nodes_and_edges.py:61-66

提示词模块结构

每个提示词模块遵循一致的模式,包含:

  • Pydantic 响应模型,定义预期的大语言模型(LLM)输出模式。
  • 提示函数,接受上下文并返回 list[Message]
  • 协议类,定义模块的接口以实现类型安全。
  • 版本字典,将提示名称映射到函数。
通用模式

所有提示函数遵循以下签名:

def prompt_function(context: dict[str, Any]) -> list[Message]:
    return [
        Message(role='system', content='系统指令...'),
        Message(role='user', content='包含 {context["variables"]} 的用户提示...'),
    ]

Message 类型定义在 graphiti_core/prompts/models.py 中,表示对话中的单条消息。

来源: graphiti_core/prompts/extract_nodes.py:83-128, graphiti_core/prompts/models.py

节点提取提示词

extract_nodes.py 模块提供了从不同剧集类型中提取实体节点的提示词。

提示函数
函数用途响应模型关键上下文字段
extract_message从对话消息中提取实体ExtractedEntitiesentity_types, previous_episodes, episode_content
extract_json从 JSON 数据中提取实体ExtractedEntitiesentity_types, source_description, episode_content
extract_text从非结构化文本中提取实体ExtractedEntitiesentity_types, episode_content
classify_nodes按类型对实体进行分类ExtractedEntitiesentity_types, episode_content
extract_attributes提取实体的结构化属性自定义 Pydantic 模型node_name, node_summary, attributes
extract_summary生成或更新实体摘要EntitySummarynode_name, node_summary, episode_content
extract_summaries_batch批量生成/更新实体摘要SummarizedEntitiessummaries
extract_entity_summaries_from_episodes从剧集中提取实体摘要SummarizedEntitiesentity_summaries, episodes
响应模型

ExtractedEntity 模型定义了提取实体的结构:

class ExtractedEntity(BaseModel):
    name: str = Field(..., description='提取实体的名称')
    entity_type_id: int = Field(
        description='分类实体类型的 ID。'
        '必须是提供的 entity_type_id 整数之一。',
    )
    episode_indices: list[int] = Field(default_factory=lambda: [0])

来源: graphiti_core/prompts/extract_nodes.py:28-42, graphiti_core/prompts/extract_nodes.py:83-154

合并节点与边提取

extract_nodes_and_edges.py 模块提供了一个单一的提示词,用于同时提取实体和关系。这种方法可以带来更好的节点和边之间的一致性。

提示函数
函数用途响应模型关键上下文字段
extract_message从对话消息中一次性提取实体和边CombinedExtractionentity_types, edge_types, previous_episodes, episode_content, custom_extraction_instructions
响应模型

CombinedEntityCombinedFact 模型定义了合并提取的结构:

class CombinedEntity(BaseModel):
    name: str = Field(..., description='提取实体的名称')
    entity_type_id: int = Field(
        description='分类实体类型的 ID。'
        '必须是提供的 entity_type_id 整数之一。',
    )

class CombinedFact(BaseModel):
    source_entity_name: str = Field(..., description='提取实体列表中源实体的名称')
    target_entity_name: str = Field(..., description='提取实体列表中目标实体的名称')
    relation_type: str = Field(..., description='实体之间的关系类型,使用 SCREAMING_SNAKE_CASE 格式')
    fact: str = Field(..., description='关系的自包含自然语言描述')
    episode_indices: list[int] = Field(default_factory=lambda: [0])

class CombinedExtraction(BaseModel):
    extracted_entities: list[CombinedEntity] = Field(..., description='提取实体的列表')
    edges: list[CombinedFact] = Field(..., description='提取的关系事实列表')

graphiti_core/prompts/extract_nodes_and_edges.py:91-159 中的 extract_message 提示词包含了实体和事实提取的详细规则,强调自包含的事实、正确的实体命名以及剧集索引的处理。_build_edge_types_section 辅助函数 graphiti_core/prompts/extract_nodes_and_edges.py:76-88 会动态地将可用的边类型添加到提示上下文中。

来源: graphiti_core/prompts/extract_nodes_and_edges.py:25-67, graphiti_core/prompts/extract_nodes_and_edges.py:91-159, graphiti_core/prompts/extract_nodes_and_edges.py:76-88

节点去重提示词

dedupe_nodes.py 模块提供了用于识别和解析重复实体的提示词。

提示函数
函数用途响应模型关键上下文字段
node检查单个新实体是否与现有实体重复NodeResolutionsextracted_node, existing_nodes, entity_type_description
nodes对批量提取的实体进行去重NodeResolutionsextracted_nodes, existing_nodes
node_list对现有节点列表进行去重NodeResolutionsnodes
NodeDuplicate 响应模型

NodeDuplicate 模型 graphiti_core/prompts/dedupe_nodes.py:25-35 指定了去重结果的结构:

class NodeDuplicate(BaseModel):
    id: int = Field(..., description='实体的整数 ID')
    name: str = Field(..., description='实体的名称。应该是描述最完整、最清晰的名称...')
    duplicate_candidate_id: int = Field(..., description='匹配的现有实体的 candidate_id,如果不存在重复则为 -1。')

该提示词强制执行严格规则:

  • 实体必须指向*相同的现实世界对象或概念*才能被视为重复 graphiti_core/prompts/dedupe_nodes.py:83
  • 语义等价:如果一个描述性标签明确指向一个命名实体,则将其视为重复 graphiti_core/prompts/dedupe_nodes.py:84
  • 只能使用来自 现有实体candidate_id graphiti_core/prompts/dedupe_nodes.py:92

来源: graphiti_core/prompts/dedupe_nodes.py:25-35, graphiti_core/prompts/dedupe_nodes.py:53-114

边提取提示词

extract_edges.py 模块提供了用于提取实体间事实关系的提示词。

边响应模型

Edge 模型 graphiti_core/prompts/extract_edges.py:25-52 定义了提取关系的结构:

class Edge(BaseModel):
    source_entity_name: str
    target_entity_name: str
    relation_type: str  # SCREAMING_SNAKE_CASE
    fact: str  # 自然语言描述
    valid_at: str | None  # ISO 8601
    invalid_at: str | None  # ISO 8601
    episode_indices: list[int]
提取规则

edge 提示词 graphiti_core/prompts/extract_edges.py:69-141 强制执行关键规则:

  • 实体名称校验source_entity_nametarget_entity_name 必须仅使用提供的 实体 列表中的 namegraphiti_core/prompts/extract_edges.py:121-122
  • 时间解析:使用 参考时间 来解析诸如“上周”之类的模糊表达 graphiti_core/prompts/extract_edges.py:135
  • 关系类型化:如果提供了 事实类型,则使用对应的 SCREAMING_SNAKE_CASE 类型 graphiti_core/prompts/extract_edges.py:32-35

来源: graphiti_core/prompts/extract_edges.py:25-52, graphiti_core/prompts/extract_edges.py:69-141

边去重与解析

dedupe_edges.py 模块处理合并事实和检测矛盾的逻辑。

解析边提示词

resolve_edge 函数 graphiti_core/prompts/dedupe_edges.py:43-100 用于判断一个新事实是重复还是矛盾。

Graphiti · 解析边提示词 · 图 2
Graphiti · 解析边提示词 · 图 2

来源: graphiti_core/prompts/dedupe_edges.py:43-100, graphiti_core/prompts/dedupe_edges.py:24-32

EdgeDuplicate 响应模型
class EdgeDuplicate(BaseModel):
    duplicate_facts: list[int] = Field(..., description='重复事实的 idx 值列表(仅来自现有事实范围)')
    contradicted_facts: list[int] = Field(..., description='矛盾事实的 idx 值列表(来自完整 idx 范围)')

来源: graphiti_core/prompts/dedupe_edges.py:24-32

摘要提示词

Graphiti 使用多个摘要提示词来处理节点和 Saga 剧集链。

节点摘要

summarize_nodes.py 模块管理实体描述和摘要合成。

  • 字符限制:所有提示词通过 MAX_SUMMARY_CHARS(默认 1000)强制执行字符限制 graphiti_core/prompts/summarize_nodes.py:33, 71, 129, graphiti_core/utils/text_utils.py:26
  • 合成对summarize_pair graphiti_core/prompts/summarize_nodes.py:54-77 将两个摘要合并为一个紧凑的摘要。
  • 上下文摘要summarize_context graphiti_core/prompts/summarize_nodes.py:80-116 使用 消息实体属性 来生成一个遵循 summary_instructions 代码片段 graphiti_core/prompts/snippets.py:19-34 的摘要。
Saga 摘要

summarize_sagas.py 模块为叙事序列生成事实性知识简报 graphiti_core/prompts/summarize_sagas.py:41-135

  • 字符限制:强制执行 MAX_SUMMARY_CHARS(默认 1000)graphiti_core/prompts/summarize_sagas.py:29, 67, graphiti_core/utils/text_utils.py:26
  • 约束:严格禁止使用诸如“提到”或“讨论”之类的元语言 graphiti_core/prompts/summarize_sagas.py:72-74
  • 偏好处理:仅在明确陈述的情况下才捕获偏好(例如,“我更喜欢 X”)graphiti_core/prompts/summarize_sagas.py:78-80

来源: graphiti_core/prompts/summarize_nodes.py:54-116, graphiti_core/prompts/summarize_sagas.py:41-135, graphiti_core/prompts/snippets.py:19-34, graphiti_core/utils/text_utils.py:26

提示词库实现

该库使用包装器模式为核心客户端提供干净的 API。

PromptLibraryWrapper

PromptLibraryWrapper graphiti_core/prompts/lib.py:86-90 遍历实现映射并设置 PromptTypeWrapper 实例。这允许通过 prompt_library.extract_nodes.extract_message(context) 调用提示词。

Unicode 处理

VersionWrapper graphiti_core/prompts/lib.py:70-72 会自动将 DO_NOT_ESCAPE_UNICODE 附加到系统消息中,以确保大语言模型(LLM)输出正确处理非 ASCII 字符。

来源: graphiti_core/prompts/lib.py:64-96, graphiti_core/prompts/prompt_helpers.py:20-21

搜索上下文生成

虽然本身不是提示词,但 search_results_to_context_string graphiti_core/search/search_helpers.py:27-72 是一个关键的辅助函数,它将 SearchResults 格式化为结构化的 XML 风格字符串(<FACTS><ENTITIES> 等),以便作为检索增强生成(RAG)上下文注入到下游大语言模型(LLM)提示词中。

来源: graphiti_core/search/search_helpers.py:27-72