2026-02-24 18:03:47 +08:00
|
|
|
|
import assert from 'node:assert/strict'
|
|
|
|
|
|
|
|
|
|
|
|
import { MessageProcessor } from '../messageProcessor.js'
|
|
|
|
|
|
|
|
|
|
|
|
const databases = [{ name: '财税库' }, { name: 'DifyKB' }, { name: 'LightGraphKB' }]
|
|
|
|
|
|
|
|
|
|
|
|
const run = () => {
|
|
|
|
|
|
const conv = {
|
|
|
|
|
|
messages: [
|
|
|
|
|
|
{
|
|
|
|
|
|
type: 'ai',
|
|
|
|
|
|
tool_calls: [
|
|
|
|
|
|
{
|
|
|
|
|
|
name: '财税库',
|
|
|
|
|
|
tool_call_result: {
|
|
|
|
|
|
content: JSON.stringify([
|
|
|
|
|
|
{
|
|
|
|
|
|
content: 'A',
|
|
|
|
|
|
score: 0.9,
|
2026-03-04 04:13:05 +08:00
|
|
|
|
metadata: { source: 'doc-a', chunk_id: 'c1', file_id: 'f1', chunk_index: 1 }
|
2026-02-24 18:03:47 +08:00
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
content: 'A',
|
|
|
|
|
|
score: 0.8,
|
2026-03-04 04:13:05 +08:00
|
|
|
|
metadata: { source: 'doc-a', chunk_id: 'c1', file_id: 'f1', chunk_index: 1 }
|
|
|
|
|
|
}
|
|
|
|
|
|
])
|
|
|
|
|
|
}
|
2026-02-24 18:03:47 +08:00
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'LightGraphKB',
|
|
|
|
|
|
tool_call_result: {
|
|
|
|
|
|
content: JSON.stringify({
|
|
|
|
|
|
data: {
|
|
|
|
|
|
chunks: [
|
|
|
|
|
|
{
|
|
|
|
|
|
content: 'B',
|
|
|
|
|
|
score: 0.4,
|
2026-03-04 04:13:05 +08:00
|
|
|
|
metadata: { source: 'doc-b', chunk_id: 'c2', file_id: 'f2', chunk_index: 2 }
|
|
|
|
|
|
}
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
2026-02-24 18:03:47 +08:00
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'not_kb_tool',
|
|
|
|
|
|
tool_call_result: {
|
2026-03-04 04:13:05 +08:00
|
|
|
|
content: JSON.stringify([{ content: 'X', score: 0.99, metadata: { chunk_id: 'cx' } }])
|
|
|
|
|
|
}
|
2026-02-24 18:03:47 +08:00
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'DifyKB',
|
2026-03-04 04:13:05 +08:00
|
|
|
|
tool_call_result: { content: 'not-json' }
|
|
|
|
|
|
}
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
]
|
2026-02-24 18:03:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const chunks = MessageProcessor.extractKnowledgeChunksFromConversation(conv, databases)
|
|
|
|
|
|
|
|
|
|
|
|
// 1. Milvus/Dify 数组提取
|
2026-03-04 04:13:05 +08:00
|
|
|
|
assert.equal(
|
|
|
|
|
|
chunks.some((c) => c.content === 'A' && c.kb_name === '财税库'),
|
|
|
|
|
|
true
|
|
|
|
|
|
)
|
2026-02-24 18:03:47 +08:00
|
|
|
|
|
2026-05-17 13:06:25 +08:00
|
|
|
|
// 2. 对象包装的 data.chunks 提取
|
2026-03-04 04:13:05 +08:00
|
|
|
|
assert.equal(
|
|
|
|
|
|
chunks.some((c) => c.content === 'B' && c.kb_name === 'LightGraphKB'),
|
|
|
|
|
|
true
|
|
|
|
|
|
)
|
2026-02-24 18:03:47 +08:00
|
|
|
|
|
|
|
|
|
|
// 3. 非知识库工具忽略
|
2026-03-04 04:13:05 +08:00
|
|
|
|
assert.equal(
|
|
|
|
|
|
chunks.some((c) => c.content === 'X'),
|
|
|
|
|
|
false
|
|
|
|
|
|
)
|
2026-02-24 18:03:47 +08:00
|
|
|
|
|
|
|
|
|
|
// 4. 非法 JSON 自动跳过
|
2026-03-04 04:13:05 +08:00
|
|
|
|
assert.equal(
|
|
|
|
|
|
chunks.some((c) => c.kb_name === 'DifyKB'),
|
|
|
|
|
|
false
|
|
|
|
|
|
)
|
2026-02-24 18:03:47 +08:00
|
|
|
|
|
|
|
|
|
|
// 5. 去重生效(chunk_id=c1 仅一条)
|
|
|
|
|
|
assert.equal(chunks.filter((c) => c.metadata?.chunk_id === 'c1').length, 1)
|
|
|
|
|
|
|
|
|
|
|
|
// 6. 分数排序(A 0.9 在 B 0.4 前)
|
|
|
|
|
|
const idxA = chunks.findIndex((c) => c.content === 'A')
|
|
|
|
|
|
const idxB = chunks.findIndex((c) => c.content === 'B')
|
|
|
|
|
|
assert.equal(idxA < idxB, true)
|
|
|
|
|
|
|
|
|
|
|
|
console.log('messageProcessor extractKnowledgeChunksFromConversation: all assertions passed')
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
run()
|