feat: enhance local knowledge retrieval

This commit is contained in:
lofyer
2026-08-12 21:45:47 +08:00
parent e0e5a8c1b3
commit 111f487e20
65 changed files with 13517 additions and 1155 deletions
+71
View File
@@ -0,0 +1,71 @@
import { mkdtemp, rm, writeFile } from 'node:fs/promises'
import { tmpdir } from 'node:os'
import { join } from 'node:path'
import { describe, expect, it } from 'vitest'
import { KnowledgeService } from './knowledge-service'
import { OpenAIEmbeddingClient } from './openai-embedding-client'
const endpoint =
process.env.GOODBUDDY_LIVE_EMBEDDING_ENDPOINT?.trim()
const model = process.env.GOODBUDDY_LIVE_EMBEDDING_MODEL?.trim()
const liveIt = endpoint && model ? it : it.skip
describe('live knowledge embeddings', () => {
liveIt(
'uses the configured provider for indexing and semantic retrieval',
async () => {
const directory = await mkdtemp(
join(tmpdir(), 'goodbuddy-live-embedding-')
)
const client = new OpenAIEmbeddingClient({
endpoint: endpoint!,
model: model!,
apiKey:
process.env.GOODBUDDY_LIVE_EMBEDDING_API_KEY,
batchSize: 8,
timeoutMs: 60_000
})
const service = new KnowledgeService({
databasePath: join(directory, 'knowledge.sqlite'),
managedRoot: join(directory, 'managed'),
embeddingProvider: client
})
try {
await service.initialize()
const sourcePath = join(directory, 'offline-guide.txt')
await writeFile(
sourcePath,
'在没有网络的环境中,先准备经过校验的安装包,再导入本地部署。',
'utf8'
)
const library = service.createLibrary({
name: 'Live embedding test',
storageMode: 'reference',
graphEnabled: false
})
await service.importPaths(library.id, [sourcePath])
const response = await service.retrieve({
knowledgeBaseId: library.id,
query: '断网时怎样安装软件?',
settings: {
...library.retrievalSettings,
ftsWeight: 0,
vectorWeight: 1,
graphWeight: 0,
minimumVectorSimilarity: 0
}
})
expect(response.diagnostics.vectorScannedCount).toBeGreaterThan(0)
expect(response.results[0]?.channels).toContain('vector')
expect(response.results[0]?.documentTitle).toBe(
'offline-guide'
)
} finally {
await service.dispose()
await rm(directory, { recursive: true, force: true })
}
},
180_000
)
})