提示词库与模板
提示词库与模板
相关源文件
本章引用的主要源码文件:
graphiti_core/prompts/dedupe_edges.pygraphiti_core/prompts/dedupe_nodes.pygraphiti_core/prompts/extract_edges.pygraphiti_core/prompts/extract_nodes.pygraphiti_core/prompts/extract_nodes_and_edges.pygraphiti_core/prompts/lib.pygraphiti_core/prompts/snippets.pygraphiti_core/prompts/summarize_nodes.pygraphiti_core/prompts/summarize_sagas.pygraphiti_core/utils/maintenance/combined_extraction.pygraphiti_core/utils/text_utils.pytests/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_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 | 从对话消息中提取实体 | ExtractedEntities | entity_types, previous_episodes, episode_content |
extract_json | 从 JSON 数据中提取实体 | ExtractedEntities | entity_types, source_description, episode_content |
extract_text | 从非结构化文本中提取实体 | ExtractedEntities | entity_types, episode_content |
classify_nodes | 按类型对实体进行分类 | ExtractedEntities | entity_types, episode_content |
extract_attributes | 提取实体的结构化属性 | 自定义 Pydantic 模型 | node_name, node_summary, attributes |
extract_summary | 生成或更新实体摘要 | EntitySummary | node_name, node_summary, episode_content |
extract_summaries_batch | 批量生成/更新实体摘要 | SummarizedEntities | summaries |
extract_entity_summaries_from_episodes | 从剧集中提取实体摘要 | SummarizedEntities | entity_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 | 从对话消息中一次性提取实体和边 | CombinedExtraction | entity_types, edge_types, previous_episodes, episode_content, custom_extraction_instructions |
响应模型
CombinedEntity 和 CombinedFact 模型定义了合并提取的结构:
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 | 检查单个新实体是否与现有实体重复 | NodeResolutions | extracted_node, existing_nodes, entity_type_description |
nodes | 对批量提取的实体进行去重 | NodeResolutions | extracted_nodes, existing_nodes |
node_list | 对现有节点列表进行去重 | NodeResolutions | nodes |
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_idgraphiti_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_name和target_entity_name必须仅使用提供的实体列表中的name值graphiti_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_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_pairgraphiti_core/prompts/summarize_nodes.py:54-77将两个摘要合并为一个紧凑的摘要。 - 上下文摘要:
summarize_contextgraphiti_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