50 lines
1.8 KiB
Python
50 lines
1.8 KiB
Python
from typing import Any
|
||
|
||
|
||
def resolve_facts(context: dict[str, Any]) -> list[dict]:
|
||
existing_facts = context.get('existing_facts', [])
|
||
new_fact = context.get('new_fact', '')
|
||
invalidation_candidates = context.get('invalidation_candidates', [])
|
||
|
||
existing_text = '\n'.join(
|
||
f' [idx={i}] {f.get("fact", "")}' for i, f in enumerate(existing_facts)
|
||
)
|
||
|
||
invalidation_text = '\n'.join(
|
||
f' [idx={i + len(existing_facts)}] {f.get("fact", "")}'
|
||
for i, f in enumerate(invalidation_candidates)
|
||
)
|
||
|
||
user_prompt = f"""
|
||
<已有事实>
|
||
{existing_text}
|
||
</已有事实>
|
||
|
||
<事实失效候选>
|
||
{invalidation_text}
|
||
</事实失效候选>
|
||
|
||
<新事实>
|
||
{new_fact}
|
||
</新事实>
|
||
|
||
注意:idx 编号是连续的——已有事实从 0 开始,失效候选紧随其后。
|
||
|
||
任务:
|
||
1. **重复检测**:如果<新事实>与<已有事实>中的某条描述的是完全相同的客观事实,返回该 idx。
|
||
2. **矛盾检测**:如果<新事实>与<已有事实>或<失效候选>中的某条相互矛盾(如状态已更新、数值已变更),返回该 idx。
|
||
|
||
返回格式:
|
||
{{"duplicate_facts": [idx列表], "contradicted_facts": [idx列表]}}
|
||
如果没有重复或矛盾,返回空列表。
|
||
|
||
示例:
|
||
- 新事实:"张三负责宽带运维项目" vs 已有:"张三负责宽带运维" → 重复(相同事实)
|
||
- 新事实:"宽带用户数当前值 8500" vs 已有:"宽带用户数目标值 10000" → 不重复,不矛盾(数值维度不同)
|
||
- 新事实:"宽带用户数当前值 9000" vs 已有:"宽带用户数 8000" → 矛盾(同一指标数值更新)
|
||
"""
|
||
return [
|
||
{'role': 'system', 'content': '你是事实去重和矛盾检测助手。判断新事实与已有事实的关系。'},
|
||
{'role': 'user', 'content': user_prompt},
|
||
]
|