@aalis/plugin-user-relation 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/actions.d.ts +13 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +705 -0
- package/dist/actions.js.map +1 -0
- package/dist/commands.d.ts +46 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +601 -0
- package/dist/commands.js.map +1 -0
- package/dist/consolidate-llm.d.ts +150 -0
- package/dist/consolidate-llm.d.ts.map +1 -0
- package/dist/consolidate-llm.js +373 -0
- package/dist/consolidate-llm.js.map +1 -0
- package/dist/extractor.d.ts +308 -0
- package/dist/extractor.d.ts.map +1 -0
- package/dist/extractor.js +1356 -0
- package/dist/extractor.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +626 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware.d.ts +41 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +281 -0
- package/dist/middleware.js.map +1 -0
- package/dist/rename-watcher.d.ts +16 -0
- package/dist/rename-watcher.d.ts.map +1 -0
- package/dist/rename-watcher.js +16 -0
- package/dist/rename-watcher.js.map +1 -0
- package/dist/service.d.ts +1108 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +4462 -0
- package/dist/service.js.map +1 -0
- package/dist/store.d.ts +89 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +207 -0
- package/dist/store.js.map +1 -0
- package/dist/tools.d.ts +48 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +1630 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +432 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +94 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +419 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +1630 -0
- package/dist/utils.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* consolidate 阶段的可选 LLM 集成:
|
|
3
|
+
* (A) 别名候选语义核验:对 autoLink 待合并的实体对,让 LLM 二判 yes/no
|
|
4
|
+
* (B) 合并后摘要重写:合并完成后用大上下文模型重写 canonical 实体的 summary
|
|
5
|
+
*
|
|
6
|
+
* 这两步都是「可选」:仅当 consolidationModel 已配置时启用,否则保持原算法行为。
|
|
7
|
+
*/
|
|
8
|
+
import type { Context } from '@aalis/core';
|
|
9
|
+
import { type LLMModel, type ModelRef } from '@aalis/plugin-llm-api';
|
|
10
|
+
import type { EntityNode, EventNode, PersonNode } from './types.js';
|
|
11
|
+
interface ConsolidateLLMConfig {
|
|
12
|
+
modelRef: ModelRef;
|
|
13
|
+
disableThinking?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/** 解析配置的 LLM 模型;未配置或不可用时返回 undefined。 */
|
|
16
|
+
export declare function resolveConsolidateModel(ctx: Context, cfg: ConsolidateLLMConfig | undefined): LLMModel | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* (A) 判断两个实体是否为同一实体。LLM 输出 JSON:{"isSame": boolean, "reason": string}
|
|
19
|
+
* 解析失败或 LLM 表示不是 → 返回 false。
|
|
20
|
+
*
|
|
21
|
+
* F2 / 统一改造:给 LLM 喂"对称且丰富"的上下文,便于科学判断是否合并:
|
|
22
|
+
* - 双方 ≤3 条 evidence 文本片段
|
|
23
|
+
* - 双方邻居 **总数 + top-K {name,weight}**(按 weight 倒序)
|
|
24
|
+
* - 可用的相似度分数(cosine / jaccard / structural / fused,任意子集)
|
|
25
|
+
* 与 verifyEventPair 共用 PairNeighborProfile / PairScores 形态。
|
|
26
|
+
*/
|
|
27
|
+
/** 邻居剖面:人/事件/实体三类,各含总数 + top-K (name, weight) */
|
|
28
|
+
export interface PairNeighborProfile {
|
|
29
|
+
peopleCount: number;
|
|
30
|
+
eventCount: number;
|
|
31
|
+
entityCount: number;
|
|
32
|
+
topPeople: Array<{
|
|
33
|
+
name: string;
|
|
34
|
+
weight: number;
|
|
35
|
+
}>;
|
|
36
|
+
topEvents: Array<{
|
|
37
|
+
name: string;
|
|
38
|
+
weight: number;
|
|
39
|
+
}>;
|
|
40
|
+
topEntities: Array<{
|
|
41
|
+
name: string;
|
|
42
|
+
weight: number;
|
|
43
|
+
}>;
|
|
44
|
+
}
|
|
45
|
+
/** 候选对相似度分数(各项独立可选;缺失字段不渲染) */
|
|
46
|
+
interface PairScores {
|
|
47
|
+
/** 余弦相似(embedding 向量内积)0..1 */
|
|
48
|
+
cosineScore?: number;
|
|
49
|
+
/** 文本/集合 Jaccard 相似 0..1(事件用 title+aliases token;实体用 name+aliases) */
|
|
50
|
+
jaccardScore?: number;
|
|
51
|
+
/** 结构相似(Katz + AA 等图相似度融合)0..1 */
|
|
52
|
+
structuralScore?: number;
|
|
53
|
+
/** 综合分(例如 0.7·cos + 0.3·struct)0..1 */
|
|
54
|
+
fusedScore?: number;
|
|
55
|
+
}
|
|
56
|
+
interface AliasPairContext {
|
|
57
|
+
/** A 节点 ≤3 条 evidence 文本片段(已截断) */
|
|
58
|
+
aEvidenceQuotes?: string[];
|
|
59
|
+
/** B 节点 ≤3 条 evidence 文本片段 */
|
|
60
|
+
bEvidenceQuotes?: string[];
|
|
61
|
+
/** A 节点邻居剖面(计数 + top-K 名字+权重) */
|
|
62
|
+
aNeighbors?: PairNeighborProfile;
|
|
63
|
+
/** B 节点邻居剖面 */
|
|
64
|
+
bNeighbors?: PairNeighborProfile;
|
|
65
|
+
/** 候选对相似度分数(可选子集) */
|
|
66
|
+
scores?: PairScores;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* verifyAliasPair 三态返回:
|
|
70
|
+
* - isSame=true:两实体指代同一对象,调用方应执行 alias-merge
|
|
71
|
+
* - isSame=false, hierarchy=undefined:两实体不相关或冲突,调用方应记 mergeReject
|
|
72
|
+
* - isSame=false, hierarchy={parentId,childId}:两实体存在 part-of 关系(父子/包含),
|
|
73
|
+
* 调用方应**拒绝合并**,改建 entity-entity[part-of] 边,避免父概念被并入子概念(或反之)。
|
|
74
|
+
*/
|
|
75
|
+
interface AliasPairResult {
|
|
76
|
+
isSame: boolean;
|
|
77
|
+
reason: string;
|
|
78
|
+
hierarchy?: {
|
|
79
|
+
parentId: string;
|
|
80
|
+
childId: string;
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
export declare function verifyAliasPair(_ctx: Context, model: LLMModel, a: EntityNode, b: EntityNode, disableThinking?: boolean, context?: AliasPairContext): Promise<AliasPairResult>;
|
|
84
|
+
/**
|
|
85
|
+
* (A2) 判断两个事件是否为同一事件。LLM 输出 JSON:{"isSame": boolean, "reason": string}
|
|
86
|
+
* 类比 verifyAliasPair,针对 EventNode 字段(title/summary/category/aliases)。
|
|
87
|
+
*
|
|
88
|
+
* 调用方应已经过结构相似 + 文本相似双向过滤(避免对全图 N² 个 pair 调 LLM)。
|
|
89
|
+
* 解析失败 / 异常 → 视为 false(保守不合并)。
|
|
90
|
+
*
|
|
91
|
+
* 统一改造:与 verifyAliasPair 对称,同时接收邻居剖面(计数 + top-K 名字+权重)+ 多维相似度分数。
|
|
92
|
+
*/
|
|
93
|
+
interface EventPairContext {
|
|
94
|
+
aEvidenceQuotes?: string[];
|
|
95
|
+
bEvidenceQuotes?: string[];
|
|
96
|
+
/** A 事件邻居剖面(计数 + top-K 名字+权重) */
|
|
97
|
+
aNeighbors?: PairNeighborProfile;
|
|
98
|
+
/** B 事件邻居剖面 */
|
|
99
|
+
bNeighbors?: PairNeighborProfile;
|
|
100
|
+
/** 候选对相似度分数 */
|
|
101
|
+
scores?: PairScores;
|
|
102
|
+
}
|
|
103
|
+
export declare function verifyEventPair(_ctx: Context, model: LLMModel, a: EventNode, b: EventNode, disableThinking?: boolean, context?: EventPairContext): Promise<{
|
|
104
|
+
isSame: boolean;
|
|
105
|
+
reason: string;
|
|
106
|
+
}>;
|
|
107
|
+
/**
|
|
108
|
+
* (B) 合并后重写 canonical 实体摘要。
|
|
109
|
+
* 失败返回 undefined(保留原 summary)。
|
|
110
|
+
*/
|
|
111
|
+
export declare function rewriteEntitySummary(ctx: Context, model: LLMModel, entity: EntityNode, context: {
|
|
112
|
+
aliases: string[];
|
|
113
|
+
recentEvents: Array<Pick<EventNode, 'title' | 'summary'>>;
|
|
114
|
+
relatedPersons: Array<Pick<PersonNode, 'displayName'>>;
|
|
115
|
+
}, disableThinking?: boolean): Promise<string | undefined>;
|
|
116
|
+
/**
|
|
117
|
+
* (C) 推断实体父子层级:给定一批「名称上有包含关系」的实体对,让 LLM 确认是否真实存在 part-of 关系。
|
|
118
|
+
* 输入:候选列表,每项 {parent, child}(parent 名称是 child 名称的子串)。
|
|
119
|
+
* 输出:每项 {parentId, childId, confirmed, reason}。
|
|
120
|
+
* 解析失败 / LLM 表示 false → confirmed=false。
|
|
121
|
+
*/
|
|
122
|
+
export declare function inferEntityHierarchy(ctx: Context, model: LLMModel, candidates: Array<{
|
|
123
|
+
parent: EntityNode;
|
|
124
|
+
child: EntityNode;
|
|
125
|
+
}>, disableThinking?: boolean): Promise<Array<{
|
|
126
|
+
parentId: string;
|
|
127
|
+
childId: string;
|
|
128
|
+
confirmed: boolean;
|
|
129
|
+
reason: string;
|
|
130
|
+
}>>;
|
|
131
|
+
/**
|
|
132
|
+
* (D) 父实体「侧向推断」:给定一组同 kind 的「兄弟实体」(它们的名字共享一段前缀),
|
|
133
|
+
* 让 LLM 判断「该共同前缀作为父实体名是否有意义」。
|
|
134
|
+
* 输入:候选父名 + 候选 kind + 兄弟实体(≥2)。
|
|
135
|
+
* 输出:{ accept: boolean, suggestedName?: string, reason: string }
|
|
136
|
+
* - accept=true 且未给 suggestedName → 用原前缀;给了则用 LLM 修正后的名字(可能更通顺)。
|
|
137
|
+
* - accept=false → 调用方不创建该父实体。
|
|
138
|
+
* 解析失败 / LLM 失败 → accept=false。
|
|
139
|
+
*/
|
|
140
|
+
export declare function inferMissingParent(ctx: Context, model: LLMModel, candidate: {
|
|
141
|
+
parentName: string;
|
|
142
|
+
kind: string;
|
|
143
|
+
siblings: EntityNode[];
|
|
144
|
+
}, disableThinking?: boolean): Promise<{
|
|
145
|
+
accept: boolean;
|
|
146
|
+
suggestedName?: string;
|
|
147
|
+
reason: string;
|
|
148
|
+
}>;
|
|
149
|
+
export {};
|
|
150
|
+
//# sourceMappingURL=consolidate-llm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consolidate-llm.d.ts","sourceRoot":"","sources":["../src/consolidate-llm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* consolidate 阶段的可选 LLM 集成:
|
|
3
|
+
* (A) 别名候选语义核验:对 autoLink 待合并的实体对,让 LLM 二判 yes/no
|
|
4
|
+
* (B) 合并后摘要重写:合并完成后用大上下文模型重写 canonical 实体的 summary
|
|
5
|
+
*
|
|
6
|
+
* 这两步都是「可选」:仅当 consolidationModel 已配置时启用,否则保持原算法行为。
|
|
7
|
+
*/
|
|
8
|
+
import { LLMCapabilities, resolveLLMModel } from '@aalis/plugin-llm-api';
|
|
9
|
+
/** 解析配置的 LLM 模型;未配置或不可用时返回 undefined。 */
|
|
10
|
+
export function resolveConsolidateModel(ctx, cfg) {
|
|
11
|
+
if (!cfg)
|
|
12
|
+
return undefined;
|
|
13
|
+
const entry = resolveLLMModel(ctx, cfg.modelRef, [LLMCapabilities.Chat]);
|
|
14
|
+
return entry?.instance;
|
|
15
|
+
}
|
|
16
|
+
/** 渲染相似度分数行(仅渲染已提供的字段) */
|
|
17
|
+
function fmtScores(s) {
|
|
18
|
+
if (!s)
|
|
19
|
+
return '';
|
|
20
|
+
const parts = [];
|
|
21
|
+
if (typeof s.cosineScore === 'number')
|
|
22
|
+
parts.push(`cos ${s.cosineScore.toFixed(2)}`);
|
|
23
|
+
if (typeof s.jaccardScore === 'number')
|
|
24
|
+
parts.push(`jaccard ${s.jaccardScore.toFixed(2)}`);
|
|
25
|
+
if (typeof s.structuralScore === 'number')
|
|
26
|
+
parts.push(`struct ${s.structuralScore.toFixed(2)}`);
|
|
27
|
+
if (typeof s.fusedScore === 'number')
|
|
28
|
+
parts.push(`fused ${s.fusedScore.toFixed(2)}`);
|
|
29
|
+
return parts.length ? `相似度信号:${parts.join(' / ')}` : '';
|
|
30
|
+
}
|
|
31
|
+
/** 渲染邻居剖面:保留"邻居:人物 N / 事件 M / 实体 K"计数行 + 新增 top-K 名字+权重 */
|
|
32
|
+
function fmtNeighborProfile(n) {
|
|
33
|
+
if (!n)
|
|
34
|
+
return '';
|
|
35
|
+
const lines = [];
|
|
36
|
+
lines.push(`邻居:人物 ${n.peopleCount} / 事件 ${n.eventCount} / 实体 ${n.entityCount}`);
|
|
37
|
+
const renderTop = (label, list) => list.length === 0 ? null : ` ${label}: ${list.map(x => `${x.name}(${x.weight.toFixed(2)})`).join('、')}`;
|
|
38
|
+
const tp = renderTop('top 人物', n.topPeople);
|
|
39
|
+
const te = renderTop('top 事件', n.topEvents);
|
|
40
|
+
const tn = renderTop('top 实体', n.topEntities);
|
|
41
|
+
if (tp)
|
|
42
|
+
lines.push(tp);
|
|
43
|
+
if (te)
|
|
44
|
+
lines.push(te);
|
|
45
|
+
if (tn)
|
|
46
|
+
lines.push(tn);
|
|
47
|
+
return lines.join('\n');
|
|
48
|
+
}
|
|
49
|
+
function fmtEvidence(qs) {
|
|
50
|
+
if (!qs || qs.length === 0)
|
|
51
|
+
return '';
|
|
52
|
+
return `近期证据片段:\n${qs.map(q => ` · ${q}`).join('\n')}`;
|
|
53
|
+
}
|
|
54
|
+
export async function verifyAliasPair(_ctx, model, a, b, disableThinking = true, context) {
|
|
55
|
+
const prompt = [
|
|
56
|
+
{
|
|
57
|
+
role: 'system',
|
|
58
|
+
content: '你是一个实体消歧助手。你只输出 JSON,不要带 markdown 代码块。输出三选一格式:\n' +
|
|
59
|
+
'{"verdict": "same", "reason": "..."} // A 与 B 指代同一对象\n' +
|
|
60
|
+
'{"verdict": "hierarchy", "parent": "A"|"B", "reason": "..."} // 一方是另一方的子集/子部分/子模式/具体版本(part-of)\n' +
|
|
61
|
+
'{"verdict": "different", "reason": "..."} // 其它(不同对象 / 仅松散关联)',
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
role: 'user',
|
|
65
|
+
content: [
|
|
66
|
+
'判断以下两个实体的关系:',
|
|
67
|
+
'',
|
|
68
|
+
'【A】',
|
|
69
|
+
`名称: ${a.name}`,
|
|
70
|
+
`类型: ${a.entityKind}`,
|
|
71
|
+
a.aliases?.length ? `别名: ${a.aliases.join(', ')}` : '',
|
|
72
|
+
a.summary ? `摘要: ${a.summary}` : '',
|
|
73
|
+
fmtNeighborProfile(context?.aNeighbors),
|
|
74
|
+
fmtEvidence(context?.aEvidenceQuotes),
|
|
75
|
+
'',
|
|
76
|
+
'【B】',
|
|
77
|
+
`名称: ${b.name}`,
|
|
78
|
+
`类型: ${b.entityKind}`,
|
|
79
|
+
b.aliases?.length ? `别名: ${b.aliases.join(', ')}` : '',
|
|
80
|
+
b.summary ? `摘要: ${b.summary}` : '',
|
|
81
|
+
fmtNeighborProfile(context?.bNeighbors),
|
|
82
|
+
fmtEvidence(context?.bEvidenceQuotes),
|
|
83
|
+
'',
|
|
84
|
+
fmtScores(context?.scores),
|
|
85
|
+
'',
|
|
86
|
+
'判定要点:',
|
|
87
|
+
'- 名称相同未必同一对象(例如同名的不同游戏角色、不同公司同名项目);',
|
|
88
|
+
'- 类型不同时仍可能为同一对象——上游抽取可能把同一概念识别为不同 kind(如把游戏卡牌 "X" 既抽成 thing、又把同名概念抽成 topic;把同名作品既抽成 work 又抽成 thing),此时若名称完全相同、证据上下文相互兼容,倾向判 same;',
|
|
89
|
+
'- 但若类型完全不可调和(如 person vs work / place vs topic)且证据上下文截然不同,应判 different;',
|
|
90
|
+
'- 邻居重叠是强证据:若双方 top 人物/事件/实体出现明显同名重合(即便权重不同),强烈倾向判 same;',
|
|
91
|
+
'- 若两侧的邻居完全没有重叠,且证据片段的上下文话题截然不同,倾向判 different;',
|
|
92
|
+
'- 相似度分数(若提供):cos/jaccard ≥ 0.85 是强信号,0.6~0.85 中等,< 0.6 仅作辅助;',
|
|
93
|
+
'- 若证据片段中出现"A 又叫 B / B 即 A / 两者通用"等明示同一性的表达,倾向判 same。',
|
|
94
|
+
'',
|
|
95
|
+
'**hierarchy 判定要点(关键,避免父概念被并入子概念)**:',
|
|
96
|
+
'- 一方是另一方的「子模式 / 子地图 / 子关卡 / 子版本 / 子系列 / 子章节 / 子组件」,明显是包含关系而非同一对象,应判 hierarchy;',
|
|
97
|
+
' · 例:「三角洲行动·绝密航天」(B) part-of「三角洲行动」(A) — A 是母游戏,B 是其中一个模式',
|
|
98
|
+
' · 例:「红警 3·起义时刻」(B) part-of「红警 3」(A)',
|
|
99
|
+
' · 例:「Honkai: Star Rail·罗浮章节」(B) part-of「Honkai: Star Rail」(A)',
|
|
100
|
+
'- 当判 hierarchy 时,必须在 "parent" 字段明确指出哪一方是父("A" 或 "B")。父=更宽泛的、被包含的;子=更具体的、包含父名的;',
|
|
101
|
+
'- 当人们在聊天中把子模式名缩略为父名(如"今晚打三角洲" 实际在玩绝密航天),不要把此当成"别名"——这是缩略指代,子和父仍是不同对象;',
|
|
102
|
+
'- 若两者只是松散相关(如同一游戏厂商的不同作品、同一公司的不同产品),既不是 same 也不是 hierarchy,判 different。',
|
|
103
|
+
]
|
|
104
|
+
.filter(Boolean)
|
|
105
|
+
.join('\n'),
|
|
106
|
+
},
|
|
107
|
+
];
|
|
108
|
+
try {
|
|
109
|
+
const resp = await model.chat({ messages: prompt, temperature: 0, ...(disableThinking ? { think: false } : {}) });
|
|
110
|
+
const raw = typeof resp.content === 'string' ? resp.content : JSON.stringify(resp.content);
|
|
111
|
+
const parsed = tryParseJson(raw);
|
|
112
|
+
if (!parsed)
|
|
113
|
+
return { isSame: false, reason: 'LLM 输出无法解析' };
|
|
114
|
+
const reason = typeof parsed.reason === 'string' ? parsed.reason : '';
|
|
115
|
+
// 向后兼容:若 LLM 仍按老格式返回 {isSame},做一次映射
|
|
116
|
+
const legacy = parsed;
|
|
117
|
+
if (typeof legacy.isSame === 'boolean' && typeof parsed.verdict !== 'string') {
|
|
118
|
+
return { isSame: legacy.isSame, reason };
|
|
119
|
+
}
|
|
120
|
+
if (parsed.verdict === 'same')
|
|
121
|
+
return { isSame: true, reason };
|
|
122
|
+
if (parsed.verdict === 'hierarchy') {
|
|
123
|
+
const parent = parsed.parent === 'A' || parsed.parent === 'B' ? parsed.parent : null;
|
|
124
|
+
if (!parent)
|
|
125
|
+
return { isSame: false, reason: `${reason}(hierarchy 但 parent 字段缺失,按 different 处理)` };
|
|
126
|
+
const parentId = parent === 'A' ? a.id : b.id;
|
|
127
|
+
const childId = parent === 'A' ? b.id : a.id;
|
|
128
|
+
return { isSame: false, reason, hierarchy: { parentId, childId } };
|
|
129
|
+
}
|
|
130
|
+
if (parsed.verdict === 'different')
|
|
131
|
+
return { isSame: false, reason };
|
|
132
|
+
return { isSame: false, reason: `LLM verdict 字段非法:"${String(parsed.verdict)}"` };
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
return { isSame: false, reason: `LLM 调用失败: ${err instanceof Error ? err.message : String(err)}` };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
export async function verifyEventPair(_ctx, model, a, b, disableThinking = true, context) {
|
|
139
|
+
const prompt = [
|
|
140
|
+
{
|
|
141
|
+
role: 'system',
|
|
142
|
+
content: '你是一个事件消歧助手。你只输出 JSON,不要带 markdown 代码块。输出格式:{"isSame": true|false, "reason": "简短说明"}。' +
|
|
143
|
+
'事件是「发生过一次的事 / 一个话题段落」,若两条记录描述同一桩事 / 同一段持续讨论的话题,则视为同一事件。',
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
role: 'user',
|
|
147
|
+
content: [
|
|
148
|
+
'判断以下两个事件是否为同一事件:',
|
|
149
|
+
'',
|
|
150
|
+
'【A】',
|
|
151
|
+
`标题: ${a.title}`,
|
|
152
|
+
a.category ? `类别: ${a.category}` : '',
|
|
153
|
+
a.aliases?.length ? `别名: ${a.aliases.join(', ')}` : '',
|
|
154
|
+
a.summary ? `摘要: ${a.summary}` : '',
|
|
155
|
+
fmtNeighborProfile(context?.aNeighbors),
|
|
156
|
+
fmtEvidence(context?.aEvidenceQuotes),
|
|
157
|
+
'',
|
|
158
|
+
'【B】',
|
|
159
|
+
`标题: ${b.title}`,
|
|
160
|
+
b.category ? `类别: ${b.category}` : '',
|
|
161
|
+
b.aliases?.length ? `别名: ${b.aliases.join(', ')}` : '',
|
|
162
|
+
b.summary ? `摘要: ${b.summary}` : '',
|
|
163
|
+
fmtNeighborProfile(context?.bNeighbors),
|
|
164
|
+
fmtEvidence(context?.bEvidenceQuotes),
|
|
165
|
+
'',
|
|
166
|
+
fmtScores(context?.scores),
|
|
167
|
+
'',
|
|
168
|
+
'判定要点:',
|
|
169
|
+
'- 同一话题在短时间内被多次提及(例如「讨论夏天炎热」「讨论夏季发热」)→ 同一事件;',
|
|
170
|
+
'- 同一事件被不同视角 / 不同人复述(标题/摘要差异大但内核一致)→ 同一事件;',
|
|
171
|
+
'- 邻居重叠是强证据:若双方 top 人物/实体出现明显同名重合,强烈倾向判是;',
|
|
172
|
+
'- 不同次独立发生的同类事件(如两次不同的雷雨)→ 不同事件;',
|
|
173
|
+
'- 相似度分数(若提供):cos/fused ≥ 0.85 是强信号,0.6~0.85 中等,< 0.6 仅作辅助;struct 主要反映共邻边重叠;',
|
|
174
|
+
'- 类别差异大、邻居完全无重叠、证据上下文话题截然不同 → 倾向判否。',
|
|
175
|
+
]
|
|
176
|
+
.filter(Boolean)
|
|
177
|
+
.join('\n'),
|
|
178
|
+
},
|
|
179
|
+
];
|
|
180
|
+
try {
|
|
181
|
+
const resp = await model.chat({ messages: prompt, temperature: 0, ...(disableThinking ? { think: false } : {}) });
|
|
182
|
+
const raw = typeof resp.content === 'string' ? resp.content : JSON.stringify(resp.content);
|
|
183
|
+
const parsed = tryParseJson(raw);
|
|
184
|
+
if (!parsed || typeof parsed.isSame !== 'boolean')
|
|
185
|
+
return { isSame: false, reason: 'LLM 输出无法解析' };
|
|
186
|
+
return { isSame: parsed.isSame, reason: typeof parsed.reason === 'string' ? parsed.reason : '' };
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
return { isSame: false, reason: `LLM 调用失败: ${err instanceof Error ? err.message : String(err)}` };
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* (B) 合并后重写 canonical 实体摘要。
|
|
194
|
+
* 失败返回 undefined(保留原 summary)。
|
|
195
|
+
*/
|
|
196
|
+
export async function rewriteEntitySummary(ctx, model, entity, context, disableThinking = true) {
|
|
197
|
+
const prompt = [
|
|
198
|
+
{
|
|
199
|
+
role: 'system',
|
|
200
|
+
content: '你是一个知识库整理助手。请基于给定信息为实体重写一段简短中性的摘要(80 字以内),覆盖关键属性与近期相关事件。不要使用 markdown,直接输出纯文本摘要。',
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
role: 'user',
|
|
204
|
+
content: [
|
|
205
|
+
`实体名称: ${entity.name}`,
|
|
206
|
+
`类型: ${entity.entityKind}`,
|
|
207
|
+
context.aliases.length ? `所有别名: ${context.aliases.join(', ')}` : '',
|
|
208
|
+
entity.summary ? `当前摘要: ${entity.summary}` : '',
|
|
209
|
+
context.recentEvents.length
|
|
210
|
+
? `近期相关事件:\n${context.recentEvents.map(e => `- ${e.title}${e.summary ? ` — ${e.summary}` : ''}`).join('\n')}`
|
|
211
|
+
: '',
|
|
212
|
+
context.relatedPersons.length
|
|
213
|
+
? `相关人物: ${context.relatedPersons
|
|
214
|
+
.map(p => p.displayName)
|
|
215
|
+
.filter(Boolean)
|
|
216
|
+
.join(', ')}`
|
|
217
|
+
: '',
|
|
218
|
+
]
|
|
219
|
+
.filter(Boolean)
|
|
220
|
+
.join('\n'),
|
|
221
|
+
},
|
|
222
|
+
];
|
|
223
|
+
try {
|
|
224
|
+
const resp = await model.chat({ messages: prompt, temperature: 0.2, ...(disableThinking ? { think: false } : {}) });
|
|
225
|
+
const raw = typeof resp.content === 'string' ? resp.content : JSON.stringify(resp.content);
|
|
226
|
+
const cleaned = raw
|
|
227
|
+
.trim()
|
|
228
|
+
.replace(/^```(?:text|markdown)?\s*/i, '')
|
|
229
|
+
.replace(/```\s*$/i, '')
|
|
230
|
+
.trim();
|
|
231
|
+
return cleaned || undefined;
|
|
232
|
+
}
|
|
233
|
+
catch (err) {
|
|
234
|
+
ctx.logger.warn(`[user-relation] consolidate 摘要重写失败: ${err instanceof Error ? err.message : String(err)}`);
|
|
235
|
+
return undefined;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* (C) 推断实体父子层级:给定一批「名称上有包含关系」的实体对,让 LLM 确认是否真实存在 part-of 关系。
|
|
240
|
+
* 输入:候选列表,每项 {parent, child}(parent 名称是 child 名称的子串)。
|
|
241
|
+
* 输出:每项 {parentId, childId, confirmed, reason}。
|
|
242
|
+
* 解析失败 / LLM 表示 false → confirmed=false。
|
|
243
|
+
*/
|
|
244
|
+
export async function inferEntityHierarchy(ctx, model, candidates, disableThinking = true) {
|
|
245
|
+
if (candidates.length === 0)
|
|
246
|
+
return [];
|
|
247
|
+
const candidateLines = candidates.map((c, i) => `[${i}] 父实体: ${c.parent.name}(${c.parent.entityKind}${c.parent.summary ? `,${c.parent.summary.slice(0, 40)}` : ''})` +
|
|
248
|
+
` ← 子实体候选: ${c.child.name}(${c.child.entityKind}${c.child.summary ? `,${c.child.summary.slice(0, 40)}` : ''})`);
|
|
249
|
+
const prompt = [
|
|
250
|
+
{
|
|
251
|
+
role: 'system',
|
|
252
|
+
content: '你是一个实体层级推断助手。对每对实体,判断"子实体候选"是否确实属于"父实体"(part-of 关系:子是父的具体版本、模式、章节、关卡、地点分支等),而非仅仅名字字符串上包含父的名称。' +
|
|
253
|
+
'只输出 JSON 数组,不要带 markdown 代码块。格式:[{"index":0,"isPartOf":true,"reason":"简短说明"},…]',
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
role: 'user',
|
|
257
|
+
content: `请判断以下 ${candidates.length} 对实体的父子关系:\n\n${candidateLines.join('\n')}`,
|
|
258
|
+
},
|
|
259
|
+
];
|
|
260
|
+
try {
|
|
261
|
+
const resp = await model.chat({ messages: prompt, temperature: 0, ...(disableThinking ? { think: false } : {}) });
|
|
262
|
+
const raw = typeof resp.content === 'string' ? resp.content : JSON.stringify(resp.content);
|
|
263
|
+
const parsed = tryParseJson(raw);
|
|
264
|
+
if (!Array.isArray(parsed)) {
|
|
265
|
+
ctx.logger.warn('[user-relation] inferEntityHierarchy: LLM 输出无法解析为数组');
|
|
266
|
+
return candidates.map(c => ({
|
|
267
|
+
parentId: c.parent.id,
|
|
268
|
+
childId: c.child.id,
|
|
269
|
+
confirmed: false,
|
|
270
|
+
reason: 'LLM 输出解析失败',
|
|
271
|
+
}));
|
|
272
|
+
}
|
|
273
|
+
return candidates.map((c, i) => {
|
|
274
|
+
const item = parsed.find(x => x.index === i);
|
|
275
|
+
if (!item || typeof item.isPartOf !== 'boolean') {
|
|
276
|
+
return { parentId: c.parent.id, childId: c.child.id, confirmed: false, reason: 'LLM 未返回该项' };
|
|
277
|
+
}
|
|
278
|
+
return {
|
|
279
|
+
parentId: c.parent.id,
|
|
280
|
+
childId: c.child.id,
|
|
281
|
+
confirmed: item.isPartOf,
|
|
282
|
+
reason: typeof item.reason === 'string' ? item.reason : '',
|
|
283
|
+
};
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
catch (err) {
|
|
287
|
+
ctx.logger.warn(`[user-relation] inferEntityHierarchy LLM 调用失败: ${err instanceof Error ? err.message : String(err)}`);
|
|
288
|
+
return candidates.map(c => ({
|
|
289
|
+
parentId: c.parent.id,
|
|
290
|
+
childId: c.child.id,
|
|
291
|
+
confirmed: false,
|
|
292
|
+
reason: `LLM 失败: ${err instanceof Error ? err.message : String(err)}`,
|
|
293
|
+
}));
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* (D) 父实体「侧向推断」:给定一组同 kind 的「兄弟实体」(它们的名字共享一段前缀),
|
|
298
|
+
* 让 LLM 判断「该共同前缀作为父实体名是否有意义」。
|
|
299
|
+
* 输入:候选父名 + 候选 kind + 兄弟实体(≥2)。
|
|
300
|
+
* 输出:{ accept: boolean, suggestedName?: string, reason: string }
|
|
301
|
+
* - accept=true 且未给 suggestedName → 用原前缀;给了则用 LLM 修正后的名字(可能更通顺)。
|
|
302
|
+
* - accept=false → 调用方不创建该父实体。
|
|
303
|
+
* 解析失败 / LLM 失败 → accept=false。
|
|
304
|
+
*/
|
|
305
|
+
export async function inferMissingParent(ctx, model, candidate, disableThinking = true) {
|
|
306
|
+
const siblingLines = candidate.siblings.map(s => `- ${s.name}${s.summary ? `(${s.summary.slice(0, 40)})` : ''}`);
|
|
307
|
+
const prompt = [
|
|
308
|
+
{
|
|
309
|
+
role: 'system',
|
|
310
|
+
content: '你是一个实体层级推断助手。给定一组同类「兄弟实体」和它们名字的共同前缀,判断「这个前缀作为它们的父实体名是否在现实中有意义」。' +
|
|
311
|
+
'只输出 JSON,不要带 markdown 代码块。格式:{"accept": true/false, "suggestedName": "可选,更通顺的父名", "reason": "简短说明"}。' +
|
|
312
|
+
'判断要点:' +
|
|
313
|
+
'(1) 前缀必须能独立指代一个真实存在的、被广泛理解的「父级概念」(如游戏系列、作品、品牌、地点);' +
|
|
314
|
+
'(2) 不要因为名字字面包含就硬造(例如「橙汁」不是「橙色橘子」的父级);' +
|
|
315
|
+
'(3) 若前缀仅是没意义的字符片段,accept=false;' +
|
|
316
|
+
'(4) 若前缀略不通顺但语义清晰,可在 suggestedName 给出修正名。',
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
role: 'user',
|
|
320
|
+
content: [
|
|
321
|
+
`候选父实体名: ${candidate.parentName}`,
|
|
322
|
+
`类型: ${candidate.kind}`,
|
|
323
|
+
`兄弟实体(共 ${candidate.siblings.length} 个):`,
|
|
324
|
+
...siblingLines,
|
|
325
|
+
].join('\n'),
|
|
326
|
+
},
|
|
327
|
+
];
|
|
328
|
+
try {
|
|
329
|
+
const resp = await model.chat({ messages: prompt, temperature: 0, ...(disableThinking ? { think: false } : {}) });
|
|
330
|
+
const raw = typeof resp.content === 'string' ? resp.content : JSON.stringify(resp.content);
|
|
331
|
+
const parsed = tryParseJson(raw);
|
|
332
|
+
if (!parsed || typeof parsed.accept !== 'boolean') {
|
|
333
|
+
return { accept: false, reason: 'LLM 输出解析失败' };
|
|
334
|
+
}
|
|
335
|
+
return {
|
|
336
|
+
accept: parsed.accept,
|
|
337
|
+
...(typeof parsed.suggestedName === 'string' && parsed.suggestedName.trim()
|
|
338
|
+
? { suggestedName: parsed.suggestedName.trim() }
|
|
339
|
+
: {}),
|
|
340
|
+
reason: typeof parsed.reason === 'string' ? parsed.reason : '',
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
catch (err) {
|
|
344
|
+
ctx.logger.warn(`[user-relation] inferMissingParent LLM 调用失败: ${err instanceof Error ? err.message : String(err)}`);
|
|
345
|
+
return { accept: false, reason: `LLM 失败: ${err instanceof Error ? err.message : String(err)}` };
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
function tryParseJson(text) {
|
|
349
|
+
if (!text)
|
|
350
|
+
return undefined;
|
|
351
|
+
const trimmed = text
|
|
352
|
+
.trim()
|
|
353
|
+
.replace(/^```(?:json)?\s*/i, '')
|
|
354
|
+
.replace(/```\s*$/i, '')
|
|
355
|
+
.trim();
|
|
356
|
+
try {
|
|
357
|
+
return JSON.parse(trimmed);
|
|
358
|
+
}
|
|
359
|
+
catch {
|
|
360
|
+
const s = trimmed.indexOf('{');
|
|
361
|
+
const e = trimmed.lastIndexOf('}');
|
|
362
|
+
if (s >= 0 && e > s) {
|
|
363
|
+
try {
|
|
364
|
+
return JSON.parse(trimmed.slice(s, e + 1));
|
|
365
|
+
}
|
|
366
|
+
catch {
|
|
367
|
+
return undefined;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
return undefined;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
//# sourceMappingURL=consolidate-llm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consolidate-llm.js","sourceRoot":"","sources":["../src/consolidate-llm.ts"],"names":[],"mappings":"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"}
|