from typing import Any def resolve_entities(context: dict[str, Any]) -> list[dict]: extracted = context.get('extracted_entities', []) existing = context.get('existing_entities', []) episode_content = context.get('episode_content', '') extracted_text = '\n'.join( f' [{i}] {e.get("name", "")}({e.get("entity_type", "未知")}):{e.get("description", "")}' for i, e in enumerate(extracted) ) existing_text = '\n'.join( f' [candidate_id={c.get("candidate_id", i)}] {c.get("name", "")}({c.get("entity_type", "未知")}):{c.get("summary", "")[:100]}' for i, c in enumerate(existing) ) user_prompt = f""" <当前会议内容> {episode_content} <新抽取的实体> {extracted_text} <图谱中已有的实体> {existing_text} 任务:判断<新抽取的实体>中的每一个是否与<图谱中已有的实体>中的某个是同一个真实世界对象。 判断标准: - **是重复**:两个名称指向同一个真实世界的人、组织、地点、项目、指标等。 - **不是重复**:名称相似但指向不同实体(如两个同名但不同的人、同名的不同项目)。 对每个新抽取的实体,返回: - id: 对应新抽取实体列表中的序号 - name: 实体的最佳名称(优先使用已有实体中的更完整名称) - duplicate_candidate_id: 匹配到的已有实体的 candidate_id,如果无匹配则填 -1 返回格式 JSON 数组:[{{"id": 0, "name": "张三", "duplicate_candidate_id": -1}}, ...] 必须为新抽取的每个实体返回一条记录。id 从 0 开始连续编号。 """ return [ {'role': 'system', 'content': '你是实体去重助手。判断两个实体是否指向同一个真实世界对象。'}, {'role': 'user', 'content': user_prompt}, ]