s03
本体生成
知识层LLM 驱动的知识图谱 Schema 设计
用 LLM 从文档中自动设计实体类型和关系类型限制 10 个实体类型 + 10 个关系类型,并强制包含 Person/Organization 作为回退类型,在灵活性和约束之间取得平衡
LLM 驱动的知识图谱 Schema 设计
用 LLM 从文档中自动设计实体类型和关系类型限制 10 个实体类型 + 10 个关系类型,并强制包含 Person/Organization 作为回退类型,在灵活性和约束之间取得平衡
知识图谱需要预先定义实体类型和关系类型(本体),但不同领域的文档差异巨大。MiroFish 用 LLM 分析文档内容自动设计本体 Schema,同时通过硬约束(10 类型上限、必须包含兜底类型)确保输出可控。
核心约束:正好 10 个实体类型,最后 2 个必须是 Person/Organization 兜底类型
ONTOLOGY_SYSTEM_PROMPT = """你是一个专业的知识图谱本体设计专家。
数量要求:必须正好10个实体类型
层次结构要求:
A. 兜底类型(必须包含,放在列表最后2个):
- Person: 任何自然人个体的兜底类型
- Organization: 任何组织机构的兜底类型
B. 具体类型(8个,根据文本内容设计):
- 针对文本中出现的主要角色,设计更具体的类型
实体必须是现实中可以发声的主体,不可以是抽象概念。
属性名不能使用 name、uuid、group_id 等保留字。"""防御性后处理:强制确保兜底类型存在,截断超长描述
def _validate_and_process(self, result):
# 确保兜底类型存在
entity_names = {e["name"] for e in result["entity_types"]}
has_person = "Person" in entity_names
has_organization = "Organization" in entity_names
fallbacks_to_add = []
if not has_person:
fallbacks_to_add.append(person_fallback)
if not has_organization:
fallbacks_to_add.append(organization_fallback)
if fallbacks_to_add:
current_count = len(result["entity_types"])
needed_slots = len(fallbacks_to_add)
if current_count + needed_slots > MAX_ENTITY_TYPES:
to_remove = current_count + needed_slots - MAX_ENTITY_TYPES
result["entity_types"] = result["entity_types"][:-to_remove]
result["entity_types"].extend(fallbacks_to_add)
# Zep API 限制
if len(result["entity_types"]) > 10:
result["entity_types"] = result["entity_types"][:10]
return result