feat: enhance local knowledge retrieval
This commit is contained in:
@@ -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
|
||||
)
|
||||
})
|
||||
Reference in New Issue
Block a user