@shenghuabi/knowledge 1.0.21
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/embedding/embedding.service.d.ts +4 -0
- package/embedding/index.d.ts +2 -0
- package/embedding/type.d.ts +12 -0
- package/embedding.mjs +61 -0
- package/embedding.mjs.map +7 -0
- package/file-parser/const.d.ts +20 -0
- package/file-parser/dict/dict-format/dsl/dsl-parse.service.d.ts +6 -0
- package/file-parser/dict/dict-format/dsl/dsl.format.d.ts +1 -0
- package/file-parser/dict/dict-format/mdict-parse.service.d.ts +20 -0
- package/file-parser/dict/dict-format/stardict-parse.service.d.ts +12 -0
- package/file-parser/dict/dict-format/yaml-parse.service.d.ts +25 -0
- package/file-parser/dict/dict.service.d.ts +10 -0
- package/file-parser/dict/index.d.ts +2 -0
- package/file-parser/dict/type.d.ts +24 -0
- package/file-parser/document-file-parser.service.d.ts +15 -0
- package/file-parser/document-loader/pdf-img.loader.d.ts +8 -0
- package/file-parser/document-loader/xlsx.loader.d.ts +6 -0
- package/file-parser/file-parser.service.d.ts +13 -0
- package/file-parser/index.d.ts +6 -0
- package/file-parser/text-analyse.d.ts +1 -0
- package/file-parser/text-parser.d.ts +3 -0
- package/file-parser/vl-parser/markdown.parser.d.ts +8 -0
- package/file-parser.mjs +850 -0
- package/file-parser.mjs.map +7 -0
- package/image/convert.d.ts +25 -0
- package/image/extract.d.ts +2 -0
- package/image/image-metadata.d.ts +2 -0
- package/image/index.d.ts +3 -0
- package/image.mjs +134 -0
- package/image.mjs.map +7 -0
- package/knowledge/article/article.knowledge.service.d.ts +53 -0
- package/knowledge/article/define/config.d.ts +60 -0
- package/knowledge/article/define/index.d.ts +2 -0
- package/knowledge/article/define/payload.d.ts +16 -0
- package/knowledge/article/index.d.ts +2 -0
- package/knowledge/common/common.knowledge.service.d.ts +240 -0
- package/knowledge/common/define/base.d.ts +7 -0
- package/knowledge/common/define/chunk.d.ts +14 -0
- package/knowledge/common/define/embedding.d.ts +5 -0
- package/knowledge/common/define/index.d.ts +3 -0
- package/knowledge/common/index.d.ts +1 -0
- package/knowledge/common/query.d.ts +7 -0
- package/knowledge/const.d.ts +95 -0
- package/knowledge/define/index.d.ts +245 -0
- package/knowledge/dict/define/config.d.ts +68 -0
- package/knowledge/dict/define/index.d.ts +1 -0
- package/knowledge/dict/dict.knowledge.service.d.ts +67 -0
- package/knowledge/graph/const.d.ts +20 -0
- package/knowledge/graph/define/config.d.ts +169 -0
- package/knowledge/graph/define/define.d.ts +402 -0
- package/knowledge/graph/define/index.d.ts +2 -0
- package/knowledge/graph/define/query.d.ts +14 -0
- package/knowledge/graph/graph.handle.service.d.ts +28 -0
- package/knowledge/graph/graph.knowledge.service.d.ts +40 -0
- package/knowledge/graph/graph.local.service.d.ts +85 -0
- package/knowledge/graph/graph.query.service.d.ts +160 -0
- package/knowledge/graph/graph.service.d.ts +24 -0
- package/knowledge/graph/graph.util.service.d.ts +31 -0
- package/knowledge/graph/type.d.ts +11 -0
- package/knowledge/graph/util/format-attr.d.ts +48 -0
- package/knowledge/graph/util/graph-util.d.ts +5 -0
- package/knowledge/graph/util.d.ts +1 -0
- package/knowledge/graph/vecotr-format.d.ts +11 -0
- package/knowledge/index.d.ts +17 -0
- package/knowledge/knowledge.manager.service.d.ts +42 -0
- package/knowledge/knowledge.util.service.d.ts +21 -0
- package/knowledge/normal/define/config.d.ts +60 -0
- package/knowledge/normal/define/index.d.ts +1 -0
- package/knowledge/normal/normal.knowledge.service.d.ts +49 -0
- package/knowledge/template.format.d.ts +6 -0
- package/knowledge/type.d.ts +28 -0
- package/knowledge.mjs +2856 -0
- package/knowledge.mjs.map +7 -0
- package/ocr/FileUtils.d.ts +4 -0
- package/ocr/ImageRaw.d.ts +11 -0
- package/ocr/index.d.ts +2 -0
- package/ocr/model-config.d.ts +8 -0
- package/ocr/ocr.d.ts +29 -0
- package/ocr.mjs +351 -0
- package/ocr.mjs.map +7 -0
- package/package.json +105 -0
- package/qdrant/index.d.ts +3 -0
- package/qdrant/qdrant-client.service.d.ts +396 -0
- package/qdrant/qdrant-server.service.d.ts +21 -0
- package/qdrant/type.d.ts +18 -0
- package/qdrant/util.d.ts +1 -0
- package/qdrant.mjs +274 -0
- package/qdrant.mjs.map +7 -0
- package/util/batch-queue.d.ts +6 -0
- package/util/cache-queue.d.ts +10 -0
- package/util/clone.d.ts +1 -0
- package/util/embedding-queue.d.ts +3 -0
- package/util/get-hash.d.ts +2 -0
- package/util/html-to-text/index.d.ts +5 -0
- package/util/index.d.ts +10 -0
- package/util/is-truthy.d.ts +1 -0
- package/util/log.service.d.ts +6 -0
- package/util/promise.d.ts +5 -0
- package/util/type.d.ts +1 -0
- package/util/uniq-object-key.d.ts +1 -0
- package/util.mjs +219 -0
- package/util.mjs.map +7 -0
- package/worker/custom-cache.d.ts +28 -0
- package/worker/ocr/index.d.ts +17 -0
- package/worker/ocr.mjs +75 -0
- package/worker/ocr.mjs.map +7 -0
- package/worker/reranker.mjs +180 -0
- package/worker/reranker.mjs.map +7 -0
- package/worker/set-transformers-config.d.ts +19 -0
- package/worker/text2vec/index.d.ts +9 -0
- package/worker/text2vec.mjs +194 -0
- package/worker/text2vec.mjs.map +7 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../packages/knowledge/knowledge.manager.service.ts", "../packages/knowledge/const.ts", "../packages/knowledge/dict/dict.knowledge.service.ts", "../packages/knowledge/template.format.ts", "../packages/knowledge/knowledge.util.service.ts", "../packages/knowledge/common/define/base.ts", "../packages/knowledge/normal/define/config.ts", "../packages/knowledge/common/define/embedding.ts", "../packages/knowledge/dict/define/config.ts", "../packages/knowledge/common/common.knowledge.service.ts", "../packages/knowledge/graph/graph.knowledge.service.ts", "../packages/knowledge/graph/const.ts", "../packages/knowledge/graph/vecotr-format.ts", "../packages/knowledge/normal/normal.knowledge.service.ts", "../packages/knowledge/graph/define/config.ts", "../packages/knowledge/graph/graph.util.service.ts", "../packages/knowledge/graph/define/define.ts", "../packages/knowledge/graph/util.ts", "../packages/knowledge/graph/graph.local.service.ts", "../packages/knowledge/graph/graph.handle.service.ts", "../packages/knowledge/graph/graph.service.ts", "../packages/knowledge/graph/graph.query.service.ts", "../packages/knowledge/graph/util/graph-util.ts", "../packages/knowledge/graph/util/format-attr.ts", "../packages/knowledge/graph/define/query.ts", "../packages/knowledge/article/article.knowledge.service.ts", "../packages/knowledge/article/define/payload.ts", "../packages/knowledge/article/define/config.ts", "../packages/knowledge/common/define/chunk.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n createInjector,\n inject,\n Injector,\n RootStaticInjectOptions,\n} from 'static-injector';\nimport {\n ImportList,\n KnowledgeCollectionInput,\n KnowledgeConfig,\n KnowledgeType,\n} from './type';\nimport {\n ConfigToken,\n getActivateCollectionName,\n getGraphCollectionName,\n} from './const';\nimport { DictKnowledgeService } from './dict/dict.knowledge.service';\nimport { GraphKnolwdgeService } from './graph/graph.knowledge.service';\nimport type { Provider, R3Injector, Signal } from 'static-injector';\nimport { DictInput, FileParserService } from '@shenghuabi/knowledge/file-parser';\nimport { GraphHandleService } from './graph/graph.handle.service';\nimport { NormalKnowledgeService } from './normal/normal.knowledge.service';\nimport { GraphService } from './graph/graph.service';\nimport { GraphLocalService } from './graph/graph.local.service';\nimport { GraphKnowledgeUtilService } from './graph/graph.util.service';\nimport * as fs from 'fs/promises';\nimport { fileTypeFromBuffer } from 'file-type';\nimport path from 'path';\nimport { ArticleKnowledgeService } from './article';\nimport { QdrantClientService } from '@shenghuabi/knowledge/qdrant';\nimport { LogToken } from '@shenghuabi/knowledge/util';\n\nexport class KnowledgeManagerService extends RootStaticInjectOptions {\n #injector = inject(Injector);\n #fileParser = inject(FileParserService);\n\n #cacheMap = new Map<string, R3Injector>();\n #qdClient = inject(QdrantClientService);\n async getConfig(name: string): Promise<Signal<KnowledgeConfig>> {\n throw new Error('未实现');\n }\n\n protected async getInjector(name: string, extraProviders?: Provider[]) {\n let injector = this.#cacheMap.get(name);\n if (!injector) {\n const config = await this.getConfig(name);\n const CommonProviders: Array<Provider> = [\n { provide: ConfigToken, useValue: config },\n ...(extraProviders ?? []),\n ];\n switch (config().type) {\n case 'normal':\n injector = createInjector({\n providers: [NormalKnowledgeService, ...CommonProviders],\n parent: this.#injector,\n });\n break;\n case 'article':\n injector = createInjector({\n providers: [ArticleKnowledgeService, ...CommonProviders],\n parent: this.#injector,\n });\n break;\n case 'dict':\n injector = createInjector({\n providers: [DictKnowledgeService, ...CommonProviders],\n parent: this.#injector,\n });\n break;\n case 'normal-graph':\n injector = createInjector({\n providers: [\n GraphKnolwdgeService,\n GraphLocalService,\n GraphHandleService,\n GraphService,\n GraphKnowledgeUtilService,\n ...CommonProviders,\n ],\n parent: this.#injector,\n });\n break;\n default:\n throw '';\n }\n this.#cacheMap.set(name, injector);\n }\n return injector;\n }\n async #get(name: string) {\n const injector = await this.getInjector(name);\n const config = injector.get(ConfigToken);\n switch (config().type) {\n case 'normal':\n return injector.get(NormalKnowledgeService);\n case 'dict':\n return injector.get(DictKnowledgeService);\n case 'normal-graph':\n return injector.get(GraphKnolwdgeService);\n case 'article':\n return injector.get(ArticleKnowledgeService);\n default:\n throw new Error('');\n }\n }\n\n async create(name: string, collection: KnowledgeCollectionInput) {\n const instance = await this.#get(name);\n await instance.create(instance.formatCollection(collection));\n }\n /** 普通知识库和图谱知识库用 */\n async importFiles(\n name: string,\n filePathList: string[],\n signal?: AbortSignal,\n ) {\n const injector = await this.getInjector(name);\n const logService = injector.get(LogToken);\n const instance = (await this.#get(name)) as\n | NormalKnowledgeService\n | GraphKnolwdgeService;\n for (const filePath of filePathList) {\n if (signal?.aborted) {\n return;\n }\n const content = await fs.readFile(filePath);\n const list = await this.#fileParser.parse(filePath, content);\n for (const item of list) {\n if (signal?.aborted) {\n return;\n }\n logService.info(`正在导入 ${filePath}/${item.title}`);\n const content = item.content.trim();\n if (content) {\n await instance.insertItem(item.title, content, signal);\n } else {\n logService.warn(`内容为空 ${filePath}/${item.title}`);\n }\n }\n }\n }\n /** 字典专用 */\n async importDict(name: string, input: DictInput) {\n const instance = (await this.#get(name)) as DictKnowledgeService;\n return await instance.importDict(input);\n }\n async get(name: string) {\n return (await this.#get(name)) as\n | DictKnowledgeService\n | NormalKnowledgeService\n | GraphKnolwdgeService\n | ArticleKnowledgeService;\n }\n\n async importTextFile(\n name: string,\n dir: string,\n filePathList: string[],\n signal?: AbortSignal,\n ) {\n const injector = await this.getInjector(name);\n const logService = injector.get(LogToken);\n // 文件列表应该是相对的,需要工作空间的dir\n const instance = (await this.#get(name)) as ArticleKnowledgeService;\n for (const filePath of filePathList) {\n if (signal?.aborted) {\n return;\n }\n logService.info(`正在导入 ${filePath}`);\n const buffer = await fs.readFile(path.join(dir, filePath));\n const type = await fileTypeFromBuffer(buffer);\n if (type) {\n continue;\n }\n let content;\n try {\n content = buffer.toString();\n } catch (error) {\n continue;\n }\n await instance.insertItem(filePath, content);\n }\n }\n async deleteItem(name: string, fileName: string) {\n const instance = (await this.#get(name)) as\n | NormalKnowledgeService\n | GraphKnolwdgeService;\n await instance.deleteItem(fileName);\n }\n async updateItem(name: string, fileName: string, content: string) {\n const instance = (await this.#get(name)) as\n | NormalKnowledgeService\n | GraphKnolwdgeService;\n await instance.updateItem(fileName, content);\n }\n /** 通用接口 */\n async addCollection(name: string, collection: KnowledgeCollectionInput) {\n const instance = await this.#get(name);\n await instance.addCollection(instance.formatCollection(collection));\n }\n /** 通用接口 */\n async deleteCollection(name: string, collectionName: string) {\n const instance = await this.#get(name);\n return await instance.deleteCollection(collectionName);\n }\n async changeActivateCollection(name: string, collectionName: string) {\n const instance = await this.#get(name);\n await instance.changeActivateCollection(collectionName);\n }\n async destroy(name: string) {\n const instance = await this.#get(name);\n this.#cacheMap.delete(name);\n await instance.destroy();\n }\n async export(name: string) {\n const instance = await this.#get(name);\n return await instance.export();\n }\n async import(\n name: string,\n options: {\n snapshotList: ImportList;\n activateCollection: string;\n type: KnowledgeType;\n },\n ) {\n const logService = (await this.getInjector(name)).get(LogToken);\n for (const item of options.snapshotList) {\n logService.info(`正在导入 ${item.collection}`);\n await this.#qdClient.recoverSnapshot(item.collection, {\n location: item.filePath,\n priority: 'no_sync',\n checksum: item.checksum,\n });\n }\n await this.#qdClient.setActivateCollection(\n options.activateCollection,\n getActivateCollectionName(name),\n );\n if (options.type === 'normal-graph') {\n await this.#qdClient.setActivateCollection(\n getGraphCollectionName(options.activateCollection),\n getActivateCollectionName(getGraphCollectionName(name)),\n );\n }\n }\n async getGraph(name: string) {\n const injector = await this.getInjector(name);\n return injector.get(GraphService);\n }\n}\n", "import { InjectionToken, Signal } from 'static-injector';\nimport { KnowledgeConfig, OCR, Text2Vec, TextSplitter } from './type';\nexport function getGraphCollectionName(name: string) {\n return `[图谱]${name}-定义`;\n}\n/** 进行增加删除的永远是这个 */\nexport function getActivateCollectionName(name: string) {\n return `${name}[激活]`;\n}\n\nexport const DICT_PREFIX = '[字典]-';\n\nexport const Text2VecToken = new InjectionToken<Text2Vec>('text2vec');\n\n// 解析结果需要自动过滤空pageContent\nexport const TextSplitterToken = new InjectionToken<TextSplitter>(\n 'TextSplitter',\n);\n\nexport const ConfigToken = new InjectionToken<Signal<KnowledgeConfig>>(\n 'config',\n);\nexport const GetConfigToken = new InjectionToken<\n (name: string) => Promise<KnowledgeConfig>\n>('getConfig');\n\nexport const OCRToken = new InjectionToken<OCR>('OCR');\n\nexport const DirToken = new InjectionToken<Signal<string>>('dir');\n\nexport const ReRankerToken = new InjectionToken<{\n run: (text: {\n value: string;\n docs: string[];\n }) => Promise<{ index: number; score: any }[]>;\n getQueryRatio(): number;\n}>('reranker');\n", "import { computed, inject, Signal } from 'static-injector';\nimport { QdrantClientService } from '@shenghuabi/knowledge/qdrant';\nimport {\n ConfigToken,\n DirToken,\n OCRToken,\n ReRankerToken,\n Text2VecToken,\n TextSplitterToken,\n} from '../const';\nimport { DictInput, DictService, WordItem } from '@shenghuabi/knowledge/file-parser';\nimport { v4 } from 'uuid';\nimport { promise as fastq } from 'fastq';\nimport {\n BatchQueue,\n CacheQueue,\n html2Text,\n isTruthy,\n LogToken,\n} from '@shenghuabi/knowledge/util';\nimport { entryFormat } from '../template.format';\nimport { createNormalizeVfs, path } from '@cyia/vfs2';\nimport { KnowledgeUtilService } from '../knowledge.util.service';\nimport {\n DictCollectionDefine,\n DictCollectionInlineType,\n DictKnowledgeConfigInline,\n} from './define/config';\nimport * as v from 'valibot';\nimport { CommonKnowledgeService } from '../common/common.knowledge.service';\nimport { QueryOptions } from '../common/query';\n\nexport class DictKnowledgeService extends CommonKnowledgeService {\n #text2vec = inject(Text2VecToken);\n #reranker = inject(ReRankerToken);\n\n #textSplitter = inject(TextSplitterToken);\n #ocr = inject(OCRToken, { optional: true }) || undefined;\n #config = inject<Signal<DictKnowledgeConfigInline>>(ConfigToken);\n #vfs = computed(() => createNormalizeVfs({ dir: this.#dir() }));\n #qdClient = inject(QdrantClientService);\n #dict = inject(DictService);\n #util = inject(KnowledgeUtilService);\n #dir = inject(DirToken);\n #log = inject(LogToken);\n formatCollection(input: any) {\n return v.parse(DictCollectionDefine, input);\n }\n async #createCollection(collection: DictCollectionInlineType) {\n const { exists } = await this.#qdClient.collectionExists(\n collection.collectionName,\n );\n if (exists) {\n throw new Error(`集合${collection.collectionName}已存在`);\n }\n await this.#qdClient.createCollection(collection.collectionName, {\n vectors: {\n chunk: {\n size: collection.size,\n distance: 'Cosine',\n on_disk: true,\n },\n word: {\n size: collection.size,\n distance: 'Cosine',\n on_disk: true,\n },\n },\n });\n await this.#qdClient.createPayloadKeywordIndex(\n collection.collectionName,\n 'word',\n );\n await this.#qdClient.createPayloadKeywordIndex(\n collection.collectionName,\n 'chunk',\n );\n await this.#qdClient.createPayloadKeywordIndex(\n collection.collectionName,\n 'content',\n );\n }\n /** 只创建这一次,剩下的都是插入或更新 */\n async create(collection: DictCollectionInlineType) {\n await this.#createCollection(collection);\n await this.#qdClient.setActivateCollection(\n this.#config().name,\n this.#config().activateName,\n );\n }\n async #getImportQueue(\n collection: DictCollectionInlineType,\n /** 是否要处理资源,主要是克隆用 */ assetHandle: boolean,\n ) {\n /** 资源文件夹 */\n const assetFolder = path.join(this.#dir(), 'assets');\n const contentBatchQueue = new BatchQueue((str: string[]) =>\n this.#text2vec(str, collection.collectionName),\n );\n let sum = 0;\n const updateCacheQueue = this.#util.updatePointsQueue<\n { word: number[]; chunk: number[] },\n Record<string, any>\n >(collection.collectionName);\n let updateError: Error | undefined;\n updateCacheQueue.queue.error((error) => {\n if (error) {\n updateError = error;\n updateCacheQueue.queue.killAndDrain();\n }\n });\n\n const importCacheQueue = new CacheQueue(\n fastq(async (wordList: WordItem[]) => {\n /** 数据预处理 */\n const preMergeList = (\n await Promise.all(\n wordList.map(async (entryItem) => {\n // 词条提取\n if (assetHandle) {\n if (this.#config().extractorWord) {\n this.#vfs().write(entryItem.word, entryItem.content);\n }\n }\n const formatedContent = assetHandle\n ? await this.#formatContent(entryItem, assetFolder, {\n useOcr: this.#config().useOcr,\n refReplace: true,\n })\n : (entryItem as any).formatedContent || entryItem.content;\n const splitContentList = (\n await this.#textSplitter(\n formatedContent,\n {\n ...entryItem,\n formatedContent,\n },\n collection.collectionName,\n )\n ).filter((item) => !!item.pageContent.trim());\n if (!splitContentList.length) {\n return undefined;\n }\n return {\n word: entryItem.word,\n contentList: splitContentList\n .map((item) => {\n const pageContent = item.pageContent.trim();\n const metadata = {\n ...item.metadata,\n chunk: pageContent,\n } as Record<string, any>;\n const embeddingChunk = entryFormat(\n metadata,\n this.#config().name,\n `${metadata['word']}\\n${pageContent}`,\n collection.embeddingTemplate?.entry,\n );\n if (!embeddingChunk) {\n this.#log.warn(\n `内容格式化后内容为空,跳过\\n${JSON.stringify({ payload: metadata, knowledge: this.#config().name, pageContent })}`,\n );\n return;\n }\n metadata['embeddingChunk'] = embeddingChunk;\n return {\n chunk: embeddingChunk,\n metadata: metadata,\n };\n })\n .filter(isTruthy),\n };\n }),\n )\n )\n .filter(isTruthy)\n .filter((item) => !!item.contentList.length);\n if (!preMergeList.length) {\n return;\n }\n const [wordVecResult, contentVecResult] = await Promise.all([\n this.#text2vec(\n preMergeList.map((item) => item.word),\n collection.collectionName,\n ),\n contentBatchQueue.then(\n Promise.all(\n preMergeList.flatMap((item) =>\n item.contentList.map((item) =>\n contentBatchQueue.push(item.chunk),\n ),\n ),\n ),\n ),\n ]);\n\n let startIndex = 0;\n\n for (let i = 0; i < preMergeList.length; i++) {\n const preData = preMergeList[i];\n const wordVector = wordVecResult[i];\n const endIndex = startIndex + preData.contentList.length;\n const extResult = contentVecResult.slice(startIndex, endIndex);\n startIndex = endIndex;\n extResult.forEach((item, j) => {\n updateCacheQueue.push({\n id: v4(),\n vector: {\n word: wordVector,\n chunk: extResult[j],\n },\n payload: preData.contentList[j].metadata,\n });\n });\n }\n\n sum += wordList.length;\n this.#log.info(`已导入 ${sum} 条`);\n }, 2),\n 256,\n );\n importCacheQueue.queue.error((error) => {\n if (error) {\n updateError = error;\n importCacheQueue.queue.killAndDrain();\n }\n });\n return {\n importQueue: importCacheQueue,\n getSum: () => sum,\n updateQueue: updateCacheQueue,\n getError() {\n return updateError;\n },\n };\n }\n async importDict(input: DictInput) {\n const collection = this.#config().collectionList[0];\n /** 知识库保存的名字 */\n return this.#dict\n .importDict(this.#config().name, this.#dir(), input)\n .then(async (generator) => {\n const { importQueue, getSum, updateQueue, getError } =\n await this.#getImportQueue(collection, true);\n\n for await (const item of generator) {\n importQueue.push(item);\n }\n importQueue.complete();\n await importQueue.queue.drained();\n updateQueue.complete();\n await updateQueue.queue.drained();\n const error = getError();\n if (error) {\n throw error;\n }\n return getSum();\n })\n .catch(async (rej) => {\n this.#log.error(`导入失败`, rej);\n // 导入失败自动销毁\n await this.destroy();\n throw rej;\n });\n }\n\n async #formatContent(\n wordItem: WordItem,\n assetFolder: string,\n options: {\n useOcr?: boolean;\n refReplace: boolean;\n },\n ) {\n const result = await html2Text(wordItem.htmlContent ?? wordItem.content, {\n useOcr: options.useOcr,\n ocrFn: this.#ocr,\n assetFolder: assetFolder,\n });\n return options.refReplace ? result.replaceAll(`~`, wordItem.word) : result;\n }\n\n async addCollection(collection: DictCollectionInlineType) {\n await this.#createCollection(collection);\n\n const { importQueue, updateQueue, getError } = await this.#getImportQueue(\n collection,\n false,\n );\n\n try {\n let offset: any;\n const activateCollectionName = this.#config().activateName;\n const wordSet = new Set<string>();\n do {\n const { points, next_page_offset } = await this.#qdClient.scroll(\n activateCollectionName,\n {\n limit: 5000,\n with_payload: true,\n offset: offset,\n },\n );\n for (const point of points) {\n // 跳过已存在的词条(因为没用实体文件,所以是需要id标记)\n const id = `${point.payload!['word']}|${point.payload!['formatedContent'] || point.payload!['content']}`;\n if (wordSet.has(id)) {\n continue;\n }\n wordSet.add(id);\n importQueue.push(point.payload as any);\n }\n offset = next_page_offset;\n } while (offset);\n importQueue.complete();\n await importQueue.queue.drained();\n updateQueue.complete();\n await updateQueue.queue.drained();\n const error = getError();\n if (error) {\n throw error;\n }\n } catch (error) {\n await this.#qdClient.deleteCollection(collection.collectionName);\n throw error;\n }\n\n await this.#qdClient.setActivateCollection(\n collection.collectionName,\n this.#config().activateName,\n );\n }\n\n async deleteCollection(collectionName: string) {\n const isActivate = this.#config().activateCollection === collectionName;\n if (isActivate) {\n return false;\n }\n const collection = this.#config().collectionList.find(\n (item) => item.collectionName === collectionName,\n )!;\n if (!collection) {\n return false;\n }\n await this.#qdClient.deleteCollection(collectionName);\n return true;\n }\n async changeActivateCollection(collectionName: string) {\n await this.#qdClient.setActivateCollection(\n collectionName,\n this.#config().activateName,\n );\n }\n export() {\n return this.#util.export(\n this.#config().collectionList.map(({ collectionName }) => collectionName),\n );\n }\n\n async destroy() {\n return this.#util.destroyKnowledge(\n this.#config().collectionList.map(({ collectionName }) => collectionName),\n this.#vfs(),\n );\n }\n\n async searchWord(text: string, options: QueryOptions) {\n const queryResult = await this.#qdClient.search(\n this.#config().activateName,\n {\n limit: options.limit\n ? options.limit * this.#reranker.getQueryRatio()\n : undefined,\n with_payload: true,\n with_vector: false,\n score_threshold: options.score,\n offset: options.offset,\n vector: {\n name: 'word',\n vector: await this.#text2vec(text, this.#config().activateCollection),\n },\n },\n );\n const resultList = await this.#reranker.run({\n value: text,\n docs: queryResult.map((item) => item.payload?.['word']! as string),\n });\n return resultList\n .slice(0, options?.limit)\n .map(({ index }) => queryResult[index]);\n }\n /** 当普通数据库用 */\n matchWord(text: string, options: { limit: number }) {\n return this.#qdClient.scroll(this.#config().activateName, {\n limit: options.limit,\n filter: {\n must: {\n key: 'word',\n match: {\n value: text,\n },\n },\n },\n with_payload: true,\n with_vector: false,\n });\n }\n}\n", "import hbs from 'handlebars';\n\nexport function interpolate(input: string, value: Record<string, any>) {\n return hbs.compile(input, { noEscape: true, preventIndent: true })(value, {\n allowProtoPropertiesByDefault: true,\n });\n}\n/** 词条格式化 */\nexport function entryFormat(\n payload: Record<string, any>,\n knowledge: string,\n defaultContent: string,\n embedingTemplate?: {\n value?: string;\n enable: boolean;\n },\n) {\n return embedingTemplate?.enable && embedingTemplate?.value\n ? interpolate(embedingTemplate.value, {\n ENTRY: { ...payload, knowledge },\n }).trim()\n : defaultContent;\n}\n", "import { inject, RootStaticInjectOptions } from 'static-injector';\nimport { QdrantClient } from '@qdrant/qdrant-js';\nimport { CacheQueue } from '@shenghuabi/knowledge/util';\nimport { promise as fastq } from 'fastq';\nimport { QdrantClientService } from '@shenghuabi/knowledge/qdrant';\nimport { NormalizeFs } from '@cyia/vfs2';\n\nexport class KnowledgeUtilService extends RootStaticInjectOptions {\n #qdClient = inject(QdrantClientService);\n\n multiDelete(list: string[], filter: Parameters<QdrantClient['delete']>[1]) {\n return Promise.all(list.map((item) => this.#qdClient.delete(item, filter)));\n }\n\n updatePointsQueue<\n Vector extends Record<string, number[]>,\n Payload extends Record<string, any>,\n >(collectionName: string) {\n return new CacheQueue(\n fastq(\n (\n list: {\n id: string | number;\n vector: Vector;\n payload: Payload;\n }[],\n ) =>\n this.#qdClient.upsert(collectionName, {\n wait: true,\n points: list,\n }),\n 8,\n ),\n 20,\n );\n }\n\n async destroyKnowledge(list: string[], vfs?: NormalizeFs) {\n await Promise.all(\n list.map((collectionName) =>\n this.#qdClient.deleteCollection(collectionName),\n ),\n );\n if (vfs && (await vfs.exists(''))) {\n await vfs.rm('', { recursive: true, force: true });\n }\n }\n export(list: string[]) {\n return Promise.all(\n list.map((collectionName) =>\n this.#qdClient.createSnapshot(collectionName).then((result) => ({\n ...result,\n collection: collectionName,\n })),\n ),\n );\n }\n}\n", "import * as v from 'valibot';\nexport const BaseKnowledgeConfig = v.object({\n /** 知识库名 */\n name: v.string(),\n activateCollection: v.string(),\n});\nexport type BaseKnowledgeConfigType = v.InferOutput<typeof BaseKnowledgeConfig>;\n", "import * as v from 'valibot';\nimport { EmbeddingTemplateDefine } from '../../common/define/embedding';\nimport { BaseKnowledgeConfig } from '../../common/define/base';\nimport { getActivateCollectionName } from '../../const';\nexport const NormalCollectionDefine = v.object({\n collectionName: v.string(),\n embeddingTemplate: v.optional(\n v.object({\n entry: v.optional(EmbeddingTemplateDefine),\n }),\n ),\n size: v.number(),\n});\n\nexport const NormalKnowledgeConfigDefine = v.pipe(\n v.object({\n ...BaseKnowledgeConfig.entries,\n type: v.optional(v.literal('normal'), 'normal'),\n collectionList: v.array(NormalCollectionDefine),\n }),\n v.transform((item) => ({\n ...item,\n /** 激活的普通知识库(文件切片) */\n activateName: getActivateCollectionName(item.name),\n })),\n);\n\nexport type NormalKnowledgeConfig = v.InferInput<\n typeof NormalKnowledgeConfigDefine\n>;\nexport type NormalKnowledgeConfigInline = v.InferOutput<\n typeof NormalKnowledgeConfigDefine\n>;\nexport type NormalCollectionInput = v.InferInput<typeof NormalCollectionDefine>;\nexport type NormalCollectionInlineType = v.InferOutput<\n typeof NormalCollectionDefine\n>;\n", "import * as v from 'valibot';\nexport const EmbeddingTemplateDefine = v.object({\n enable: v.boolean(),\n value: v.optional(v.string()),\n});\n", "import { BaseKnowledgeConfig } from '../../common/define/base';\nimport { getActivateCollectionName } from '../../const';\nimport { NormalCollectionDefine } from '../../normal/define/config';\nimport * as v from 'valibot';\n\nexport const DictCollectionDefine = NormalCollectionDefine;\n\nexport const DictKnowledgeConfigDefine = v.pipe(\n v.object({\n ...BaseKnowledgeConfig.entries,\n type: v.optional(v.literal('dict'), 'dict'),\n collectionList: v.array(DictCollectionDefine),\n /** 词条提取 */\n extractorWord: v.optional(v.boolean()),\n /** 图像识别 */\n useOcr: v.optional(v.boolean()),\n }),\n v.transform((item) => ({\n ...item,\n /** 激活的普通知识库(文件切片) */\n activateName: getActivateCollectionName(item.name),\n })),\n);\n\nexport type DictKnowledgeConfig = v.InferInput<\n typeof DictKnowledgeConfigDefine\n>;\nexport type DictKnowledgeConfigInline = v.InferOutput<\n typeof DictKnowledgeConfigDefine\n>;\nexport type DictCollectionInput = v.InferInput<typeof DictCollectionDefine>;\nexport type DictCollectionInlineType = v.InferOutput<\n typeof DictCollectionDefine\n>;\n", "import { inject, Signal } from 'static-injector';\nimport { ConfigToken, ReRankerToken, Text2VecToken } from '../const';\nimport { QdrantClientService } from '@shenghuabi/knowledge/qdrant';\nimport { BaseKnowledgeConfigType } from './define/base';\nimport { FilterOptions, QueryOptions } from './query';\n\nexport class CommonKnowledgeService {\n #qdClient = inject(QdrantClientService);\n #config =\n inject<Signal<BaseKnowledgeConfigType & { activateName: string }>>(\n ConfigToken,\n );\n #text2vec = inject(Text2VecToken);\n #reranker = inject(ReRankerToken);\n\n async searchChunk(\n text: string,\n filter?: FilterOptions,\n options?: QueryOptions,\n ) {\n const queryResult = await this.#qdClient.search(\n this.#config().activateName,\n {\n limit: options?.limit\n ? options.limit * this.#reranker.getQueryRatio()\n : undefined,\n filter,\n with_payload: true,\n with_vector: false,\n score_threshold: options?.score,\n offset: options?.offset,\n vector: {\n name: 'chunk',\n vector: await this.#text2vec(text, this.#config().activateCollection),\n },\n },\n );\n\n const resultList = await this.#reranker.run({\n value: text,\n docs: queryResult.map(\n (item) => item.payload?.['embeddingChunk']! as string,\n ),\n });\n return resultList\n .slice(0, options?.limit)\n .map(({ index }) => queryResult[index]);\n }\n getCollection() {\n return this.#qdClient.getCollection(this.#config().activateName);\n }\n}\n", "import { inject, Injector, Signal } from 'static-injector';\nimport { ConfigToken, getGraphCollectionName, Text2VecToken } from '../const';\nimport { KnowledgeUtilService } from '../knowledge.util.service';\nimport { QdrantClientService } from '@shenghuabi/knowledge/qdrant';\nimport { LogToken } from '@shenghuabi/knowledge/util';\nimport { promise as fastq } from 'fastq';\n\nimport { ContentParserToken } from './const';\nimport { entryFormat } from '../template.format';\nimport { edgeVectorString, nodeVectorString } from './vecotr-format';\nimport { v4 } from 'uuid';\nimport { NormalKnowledgeService } from '../normal/normal.knowledge.service';\nimport {\n GraphCollectionDefine,\n GraphCollectionInlineType,\n GraphKnowledgeConfigInline,\n} from './define/config';\nimport * as v from 'valibot';\nimport { GraphKnowledgeUtilService } from './graph.util.service';\nimport { GraphLocalService } from './graph.local.service';\nimport { FileChunkPayload } from '../common/define/chunk';\nimport { BatchQueue } from '@shenghuabi/knowledge/util';\n\nexport class GraphKnolwdgeService extends NormalKnowledgeService {\n #text2vec = inject(Text2VecToken);\n #config = inject<Signal<GraphKnowledgeConfigInline>>(ConfigToken);\n #util = inject(KnowledgeUtilService);\n #graphUtil = inject(GraphKnowledgeUtilService);\n #qdClient = inject(QdrantClientService);\n #channel = inject(LogToken);\n #injector = inject(Injector);\n #contentParser = inject(ContentParserToken);\n #graphLocal = inject(GraphLocalService);\n\n override formatCollection(input: any) {\n return v.parse(GraphCollectionDefine, input);\n }\n async #createCollection(collection: GraphCollectionInlineType) {\n const collectionName = getGraphCollectionName(collection.collectionName);\n this.#channel.info(`创建图集合:${collectionName}`);\n const { exists } = await this.#qdClient.collectionExists(collectionName);\n if (exists) {\n throw new Error(`集合${collectionName}已存在`);\n }\n await this.#qdClient.createCollection(collectionName, {\n vectors: {\n chunk: {\n size: collection.size,\n distance: 'Cosine',\n on_disk: true,\n },\n },\n });\n this.#channel.info(`创建图索引`);\n\n await this.#qdClient.createPayloadKeywordIndex(collectionName, 'kind');\n await this.#qdClient.createPayloadKeywordIndex(collectionName, 'fileName');\n await this.#qdClient.createPayloadKeywordIndex(collectionName, 'name');\n await this.#qdClient.createPayloadKeywordIndex(collectionName, 'source');\n await this.#qdClient.createPayloadKeywordIndex(collectionName, 'target');\n }\n override async create(collection: GraphCollectionInlineType) {\n await super.create(collection);\n await this.#createCollection(collection);\n await this.#qdClient.setActivateCollection(\n collection.graphCollectionName,\n this.#config().activateGraphName,\n );\n }\n\n /** 图谱知识库不允许改chunksize,因为改了后切片就不一样了,那么生成的关系一定也不一样了 */\n override async insertItem(\n fileName: string,\n content: string,\n signal?: AbortSignal,\n ) {\n const list = await this._insertItem(fileName, content);\n if (!list || !list.length) {\n return;\n }\n const result = list[0].map(({ payload }) => payload);\n\n await this.#insert(result as any, fileName, signal);\n }\n async #insert(\n chunkList: FileChunkPayload[],\n fileName: string,\n signal?: AbortSignal,\n ) {\n const countObj = {\n success: 0,\n error: 0,\n };\n const hasGraph = !!this.#graphLocal.getGraph();\n // 工作流如果执行失败应该全退出,防止不断执行\n const llmAsyncQueue = fastq(async (document: FileChunkPayload) => {\n if (signal?.aborted) {\n return;\n }\n /** 输入解析 */\n const extractData = await this.#contentParser.parse(document, signal);\n countObj.success++;\n\n const nodes = extractData.entity.map((item) => ({\n id: v4(),\n payload: {\n ...item,\n fileName,\n chunkId: document.hash,\n },\n }));\n const edges = extractData.entity_relation.map((item) => ({\n id: v4(),\n payload: {\n ...item,\n fileName,\n chunkId: document.hash,\n },\n }));\n const keywords = extractData.keyword.map((item) => ({\n id: v4(),\n payload: {\n keyword: item,\n chunkId: document.hash,\n fileName,\n },\n }));\n await this.#graphUtil.updateContext(async () => ({\n upsert: {\n nodes,\n edges,\n keywords,\n },\n }));\n // 更新图谱\n if (hasGraph) {\n this.#graphLocal.add({\n nodes: nodes.map((item) => ({ ...item.payload, id: item.id })),\n edges: edges.map((item) => ({ ...item.payload, id: item.id })),\n });\n }\n }, this.#config().maxChunkAsync);\n llmAsyncQueue.error((error, task) => {\n if (error) {\n countObj.error++;\n this.#channel.warn(`[${fileName}]解析失败:\\n${task.chunk}\\n`, error);\n }\n });\n for (const item of chunkList) {\n llmAsyncQueue.push(item);\n }\n await llmAsyncQueue.drained();\n if (signal?.aborted) {\n return this.deleteItem(fileName);\n }\n // 如果失败过多就删除\n if (chunkList.length === countObj.error) {\n await super.deleteItem(fileName);\n }\n }\n\n override async deleteItem(fileName: string) {\n await super.deleteItem(fileName);\n await this.#util.multiDelete(\n this.#config().collectionList.map((item) => item.graphCollectionName),\n {\n filter: {\n must: [{ key: 'fileName', match: { value: fileName } }],\n should: null,\n },\n },\n );\n }\n override async updateItem(fileName: string, content: string) {\n await this.deleteItem(fileName);\n await this.insertItem(fileName, content);\n }\n\n override async addCollection(collection: GraphCollectionInlineType) {\n const activateCollectionName = this.#config().activateGraphName;\n\n await super.addCollection(collection);\n await this.#createCollection(collection);\n\n /** 从激活的集合中获取数据(理论上数据都是同步的) */\n const newCollectionName = collection.graphCollectionName;\n const batchQueue = new BatchQueue((item: string[]) =>\n this.#text2vec(item, collection.collectionName),\n );\n const queue = this.#util.updatePointsQueue(newCollectionName);\n\n let queueError = undefined;\n queue.queue.error((err) => {\n if (err) {\n queueError = err;\n queue.queue.killAndDrain();\n }\n });\n let offset: any;\n do {\n const { points, next_page_offset } = await this.#qdClient.scroll(\n activateCollectionName,\n {\n limit: 5000,\n with_payload: true,\n with_vector: false,\n offset: offset,\n },\n );\n // const instance = await this.#batchExtract$.get(config.embedding);\n await batchQueue.then(\n Promise.all([\n Promise.all(\n points.map(async (point) => {\n let embeddingChunk: string;\n if (point.payload!['kind'] === 'node') {\n embeddingChunk = entryFormat(\n point.payload!,\n this.#config().name,\n nodeVectorString(point.payload as any),\n collection.embeddingTemplate?.node,\n );\n } else if (point.payload!['kind'] === 'edge') {\n embeddingChunk = entryFormat(\n point.payload!,\n this.#config().name,\n edgeVectorString(point.payload as any),\n collection.embeddingTemplate?.edge,\n );\n } else {\n embeddingChunk = point.payload!['keyword'] as any;\n }\n const vector = await batchQueue.push(embeddingChunk);\n queue.push({\n id: point.id,\n payload: {\n ...point.payload!,\n embeddingChunk: embeddingChunk,\n },\n vector: {\n chunk: vector,\n },\n });\n }),\n ),\n ]),\n );\n\n offset = next_page_offset;\n } while (offset);\n\n queue.complete();\n await queue.queue.drained();\n if (queueError) {\n await this.#qdClient.deleteCollection(collection.collectionName);\n await this.#qdClient.deleteCollection(collection.graphCollectionName);\n throw queueError;\n }\n await this.#qdClient.setActivateCollection(\n newCollectionName,\n this.#config().activateGraphName,\n );\n }\n override async deleteCollection(collectionName: string) {\n const result = await super.deleteCollection(collectionName);\n if (!result) {\n return result;\n }\n\n const collection = this.#config().collectionList.find(\n (item) => item.collectionName === collectionName,\n )!;\n await this.#qdClient.deleteCollection(collection.graphCollectionName);\n return true;\n }\n override async changeActivateCollection(collectionName: string) {\n await super.changeActivateCollection(collectionName);\n await this.#qdClient.setActivateCollection(\n getGraphCollectionName(collectionName),\n this.#config().activateGraphName,\n );\n }\n override export() {\n return this.#util.export(\n this.#config().collectionList.flatMap(\n ({ collectionName, graphCollectionName }) => [\n collectionName,\n graphCollectionName,\n ],\n ),\n );\n }\n\n override async destroy() {\n await super.destroy();\n return this.#util.destroyKnowledge(\n this.#config().collectionList.map(\n ({ graphCollectionName }) => graphCollectionName,\n ),\n );\n }\n}\n", "import { InjectionToken } from 'static-injector';\nimport { EntityExtractType } from './define/define';\nimport { FileChunkPayload } from '../common/define/chunk';\nexport type ContentParserFn = {\n parse: (\n item: FileChunkPayload,\n signal?: AbortSignal,\n ) => Promise<EntityExtractType>;\n};\nexport const ContentParserToken = new InjectionToken<ContentParserFn>(\n 'ContentParser',\n);\n\nexport interface QueryParams {\n lengthLimit: {\n chunk: number;\n node: number;\n nodeDescription: number;\n edge: number;\n };\n topK: number;\n}\nexport const QueryParamsToken = new InjectionToken<QueryParams>('QueryParams');\nexport type RagChatFn = (data: Record<string, any>) => Promise<string>;\n\nexport const RagChatToken = new InjectionToken<RagChatFn>('RagChat');\nexport const CHAT_INPUT = `$$INPUT$$`;\n", "export function edgeVectorString(options: {\n description: string;\n source: string;\n target: string;\n keywords?: string[];\n}) {\n return `${options.keywords?.join(',') ?? ''},${options.source},${options.target},${options.description}`;\n}\nexport function nodeVectorString(options: {\n type: string;\n name: string;\n description: string;\n}) {\n return `${options.name},${options.description}`;\n}\n", "import { QdrantClientService } from '@shenghuabi/knowledge/qdrant';\nimport { computed, inject, Signal } from 'static-injector';\n\nimport { createNormalizeVfs } from '@cyia/vfs2';\nimport { promise as fastq } from 'fastq';\nimport { getHash, isTruthy, runInEmbeddingContext } from '@shenghuabi/knowledge/util';\nimport { LogToken } from '@shenghuabi/knowledge/util';\nimport {\n Text2VecToken,\n TextSplitterToken,\n ConfigToken,\n DirToken,\n} from '../const';\nimport { KnowledgeUtilService } from '../knowledge.util.service';\nimport { entryFormat } from '../template.format';\nimport {\n NormalCollectionDefine,\n NormalCollectionInlineType,\n NormalKnowledgeConfigInline,\n} from './define/config';\nimport * as v from 'valibot';\nimport { FileChunkPayload } from '../common/define/chunk';\nimport { CommonKnowledgeService } from '../common/common.knowledge.service';\n\nexport class NormalKnowledgeService extends CommonKnowledgeService {\n #text2vec = inject(Text2VecToken);\n #textSplitter = inject(TextSplitterToken);\n #config = inject<Signal<NormalKnowledgeConfigInline>>(ConfigToken);\n #util = inject(KnowledgeUtilService);\n #qdClient = inject(QdrantClientService);\n #channel = inject(LogToken);\n #vfs = computed(() => createNormalizeVfs({ dir: this.#dir() }));\n #dir = inject(DirToken);\n protected KeyWordIndex = ['fileName'];\n protected getPayload(fileName: string, content: string): Record<string, any> {\n return { fileName: fileName };\n }\n formatCollection(input: any) {\n return v.parse(NormalCollectionDefine, input);\n }\n protected async createCollection(collection: NormalCollectionInlineType) {\n this.#channel.info(\n `创建集合:${this.#config().name};嵌入长度:${collection.size}`,\n );\n const { exists } = await this.#qdClient.collectionExists(\n collection.collectionName,\n );\n if (exists) {\n throw new Error(`集合${collection.collectionName}已存在`);\n }\n await this.#qdClient.createCollection(collection.collectionName, {\n vectors: {\n chunk: {\n size: collection.size,\n distance: 'Cosine',\n on_disk: true,\n },\n },\n });\n this.#channel.info(`创建索引`);\n for (const keyword of this.KeyWordIndex) {\n await this.#qdClient.createPayloadKeywordIndex(\n collection.collectionName,\n keyword,\n );\n }\n }\n /** 创建知识库 */\n async create(collection: NormalCollectionInlineType) {\n this.#channel.info(`准备创建知识库:${this.#config().name}`);\n await this.createCollection(collection);\n await this.#qdClient.setActivateCollection(\n collection.collectionName,\n this.#config().activateName,\n );\n this.#channel.info(`创建完成:${this.#config().name}`);\n }\n\n async insertItemOnly(\n fileName: string,\n content: string,\n collectionList: NormalCollectionInlineType[],\n ) {\n return await runInEmbeddingContext(\n (t2v) =>\n Promise.all(\n collectionList.map(async (collectionItem) => {\n const chunkList = (\n await this.#textSplitter(\n content,\n this.getPayload(fileName, content),\n collectionItem.collectionName,\n )\n ).filter((item) => !!item.pageContent.trim());\n if (!chunkList.length) {\n return;\n }\n const points = await Promise.all(\n chunkList.map(async (item) => {\n const pageContent = item.pageContent.trim();\n const id = getHash(pageContent);\n const payload = {\n ...item.metadata,\n chunk: pageContent,\n hash: id,\n } as Record<string, any>;\n const embeddingChunk = entryFormat(\n payload,\n this.#config().name,\n pageContent,\n collectionItem.embeddingTemplate?.entry,\n );\n if (!embeddingChunk) {\n this.#channel.warn(\n `内容格式化后内容为空,跳过\\n${JSON.stringify({ payload, knowledge: this.#config().name, pageContent })}`,\n );\n return;\n }\n payload['embeddingChunk'] = embeddingChunk;\n return {\n id: id,\n vector: {\n chunk: await t2v(\n embeddingChunk,\n collectionItem.collectionName,\n ),\n },\n payload: payload as FileChunkPayload,\n };\n }),\n ).then((list) => list.filter(isTruthy));\n if (points.length) {\n await this.#qdClient.upsert(collectionItem.collectionName, {\n wait: true,\n points: points,\n });\n return points;\n }\n return;\n }),\n ).then((list) => list.filter(isTruthy)),\n this.#text2vec,\n );\n }\n\n protected async _insertItem(fileName: string, content: string) {\n if (await this.#vfs().exists(fileName)) {\n return false;\n }\n await this.#vfs().writeFile(fileName, content);\n return await this.insertItemOnly(\n fileName,\n content,\n this.#config().collectionList,\n );\n }\n async insertItem(fileName: string, content: string, signal?: AbortSignal) {\n await this._insertItem(fileName, content);\n }\n async deleteItem(fileName: string) {\n await this.#util.multiDelete(\n this.#config().collectionList.map((item) => item.collectionName),\n {\n filter: {\n must: [{ key: 'fileName', match: { value: fileName } }],\n should: null,\n },\n },\n );\n await this.#vfs().delete(fileName, { force: true });\n }\n async updateItem(fileName: string, content: string) {\n await this.deleteItem(fileName);\n await this.insertItem(fileName, content);\n }\n\n async addCollection(collection: NormalCollectionInlineType) {\n /** 保存文件,新创建的没有 */\n\n const list = (await this.#vfs().exists(''))\n ? await this.#vfs().readdir('')\n : [];\n await this.createCollection(collection);\n const queue = fastq(async (fileName: string) => {\n const content = await this.#vfs().readContent(fileName);\n if (typeof content !== 'string' || !content) {\n return;\n }\n await this.insertItemOnly(fileName, content, [collection]);\n }, 20);\n let queueError;\n queue.error((error) => {\n if (error) {\n queueError = error;\n queue.killAndDrain();\n }\n });\n try {\n for (const item of list) {\n queue.push(item);\n }\n await queue.drained();\n if (queueError) {\n throw queueError;\n }\n } catch (error) {\n await this.#qdClient.deleteCollection(collection.collectionName);\n throw error;\n }\n\n await this.#qdClient.setActivateCollection(\n collection.collectionName,\n this.#config().activateName,\n );\n }\n // 激活collection不可删除,所以这里不应该有删除切换的问题\n async deleteCollection(collectionName: string) {\n const isActivate = this.#config().activateCollection === collectionName;\n if (isActivate) {\n return false;\n }\n const collection = this.#config().collectionList.find(\n (item) => item.collectionName === collectionName,\n )!;\n if (!collection) {\n return false;\n }\n await this.#qdClient.deleteCollection(collectionName);\n return true;\n }\n async changeActivateCollection(collectionName: string) {\n await this.#qdClient.setActivateCollection(\n collectionName,\n this.#config().activateName,\n );\n }\n export() {\n return this.#util.export(\n this.#config().collectionList.map(({ collectionName }) => collectionName),\n );\n }\n\n async destroy() {\n return this.#util.destroyKnowledge(\n this.#config().collectionList.map(({ collectionName }) => collectionName),\n this.#vfs(),\n );\n }\n}\n", "import * as v from 'valibot';\nimport { EmbeddingTemplateDefine } from '../../common/define/embedding';\nimport { BaseKnowledgeConfig } from '../../common/define/base';\nimport { getActivateCollectionName, getGraphCollectionName } from '../../const';\nexport const GraphCollectionDefine = v.pipe(\n v.object({\n collectionName: v.string(),\n size: v.number(),\n embeddingTemplate: v.optional(\n v.object({\n entry: v.optional(EmbeddingTemplateDefine),\n node: v.optional(EmbeddingTemplateDefine),\n edge: v.optional(EmbeddingTemplateDefine),\n }),\n ),\n }),\n v.transform((collection) => ({\n ...collection,\n graphCollectionName: getGraphCollectionName(collection.collectionName),\n })),\n);\nexport const GraphKnowledgeConfigDefine = v.pipe(\n v.object({\n ...BaseKnowledgeConfig.entries,\n type: v.optional(v.literal('normal-graph'), 'normal-graph'),\n maxChunkAsync: v.number(),\n collectionList: v.array(GraphCollectionDefine),\n }),\n v.transform((input) => ({\n ...input,\n /** 激活的普通知识库(文件切片) */\n activateName: getActivateCollectionName(input.name),\n /** 激活的图数据库 */\n activateGraphName: getActivateCollectionName(\n getGraphCollectionName(input.name),\n ),\n })),\n);\n\nexport type GraphKnowledgeConfig = v.InferInput<\n typeof GraphKnowledgeConfigDefine\n>;\nexport type GraphKnowledgeConfigInline = v.InferOutput<\n typeof GraphKnowledgeConfigDefine\n>;\nexport type GraphCollectionInput = v.InferInput<typeof GraphCollectionDefine>;\nexport type GraphCollectionInlineType = v.InferOutput<\n typeof GraphCollectionDefine\n>;\n", "import { runInEmbeddingContext } from '@shenghuabi/knowledge/util';\nimport { inject, Signal } from 'static-injector';\nimport { ConfigToken, Text2VecToken } from '../const';\nimport { entryFormat } from '../template.format';\nimport { GraphKnowledgeConfigInline } from './define/config';\nimport { nodeVectorString, edgeVectorString } from './vecotr-format';\nimport { QdrantClientService } from '@shenghuabi/knowledge/qdrant';\nimport {\n EdgePayloadNewDefine,\n KeywordPayloadNewDefine,\n NodePayloadNewDefine,\n} from './define/define';\nimport * as v from 'valibot';\nexport class GraphKnowledgeUtilService {\n #qdClient = inject(QdrantClientService);\n\n #config = inject<Signal<GraphKnowledgeConfigInline>>(ConfigToken);\n #text2vec = inject(Text2VecToken);\n updateContext(\n fn: () => Promise<{\n upsert?: {\n nodes?: { id: any; payload: any }[];\n edges?: { id: any; payload: any }[];\n keywords?: { id: any; payload: any }[];\n };\n delete?: {\n nodes?: { id: any }[] | { filter?: any };\n edges?:\n | {\n id: any;\n }[]\n | { filter?: any };\n };\n }>,\n ) {\n return runInEmbeddingContext(async (t2v) => {\n const result = await fn();\n const requstList = [];\n if (result.upsert) {\n requstList.push(\n this.#config().collectionList.map(\n async ({\n graphCollectionName,\n collectionName,\n embeddingTemplate,\n }) => {\n const list = [];\n if (result.upsert?.nodes?.length) {\n list.push(\n Promise.all(\n result.upsert?.nodes.map(async (item) => {\n const embeddingChunk = entryFormat(\n item.payload,\n this.#config().name,\n nodeVectorString(item.payload),\n embeddingTemplate?.node,\n );\n return {\n id: item.id,\n payload: v.parse(NodePayloadNewDefine, {\n ...item.payload,\n embeddingChunk,\n }),\n vector: {\n chunk: await t2v(embeddingChunk, collectionName),\n },\n };\n }),\n ).then((points) =>\n this.#qdClient.upsert(graphCollectionName, { points }),\n ),\n );\n }\n if (result.upsert?.edges?.length) {\n list.push(\n Promise.all(\n result.upsert?.edges.map(async (item) => {\n const embeddingChunk = entryFormat(\n item.payload,\n this.#config().name,\n edgeVectorString(item.payload),\n embeddingTemplate?.edge,\n );\n\n return {\n id: item.id,\n payload: v.parse(EdgePayloadNewDefine, {\n ...item.payload,\n embeddingChunk,\n }),\n vector: {\n chunk: await t2v(embeddingChunk, collectionName),\n },\n };\n }),\n ).then((points) =>\n this.#qdClient.upsert(graphCollectionName, { points }),\n ),\n );\n }\n if (result.upsert?.keywords?.length) {\n list.push(\n Promise.all(\n result.upsert?.keywords.map(async (item) => ({\n id: item.id,\n payload: v.parse(KeywordPayloadNewDefine, item.payload),\n vector: {\n chunk: await t2v(item.payload.keyword, collectionName),\n },\n })),\n ).then((points) =>\n this.#qdClient.upsert(graphCollectionName, { points }),\n ),\n );\n }\n return Promise.all(list);\n },\n ),\n );\n }\n if (result.delete) {\n requstList.push(\n this.#config().collectionList.map(\n async ({ graphCollectionName, collectionName }) => {\n await Promise.all(\n [result.delete?.nodes, result.delete?.edges].map(\n (deleteData) => {\n if (Array.isArray(deleteData)) {\n if (deleteData.length) {\n return this.#qdClient.delete(graphCollectionName, {\n points: deleteData.map((item) => item.id),\n });\n }\n } else if (deleteData) {\n return this.#qdClient.delete(graphCollectionName, {\n filter: deleteData.filter,\n });\n }\n },\n ),\n );\n },\n ),\n );\n }\n return Promise.all(requstList.flat());\n }, this.#text2vec);\n }\n}\n", "import { uniqBy } from 'lodash-es';\n\nimport * as v from 'valibot';\nimport { getEdgeName } from '../util';\nimport { v4 } from 'uuid';\n/** 提取的实体 */\nexport const ENTITY_DEFINE = v.object({\n name: v.string(),\n description: v.optional(v.string(), ''),\n /** 实体类型 */\n type: v.string(),\n});\n/** 联系 */\nexport const ENTITY_RELATION_DEFINE = v.object({\n source: v.string(),\n target: v.string(),\n description: v.optional(v.string(), ''),\n strength: v.optional(v.number(), 5),\n keywords: v.optional(\n v.union([\n v.pipe(\n v.string(),\n v.transform((str) => str.split(',').map((item) => item.trim())),\n ),\n v.array(v.string()),\n ]),\n ),\n});\n\n// 一个实体可能有多个重名的.\n/** 提取定义 */\nexport const EntityExtraDefine = v.object({\n entity: v.pipe(\n v.nullish(v.array(ENTITY_DEFINE), []),\n v.transform((list) =>\n uniqBy(\n (list || []).filter((item) => !!item.name && !!item.description),\n (item) => `${item.name}|${item.type}|${item.description}`,\n ),\n ),\n ),\n entity_relation: v.pipe(\n v.nullish(v.array(ENTITY_RELATION_DEFINE), []),\n v.transform((list) =>\n uniqBy(\n (list || []).filter(\n (item) => !!item.source && !!item.target && !!item.description,\n ),\n (item) => `${item.source}|${item.target}|${item.description}`,\n ),\n ),\n ),\n keyword: v.pipe(\n v.nullish(v.array(v.string()), []),\n v.transform((item) => item.map((item) => item.trim())),\n ),\n});\nexport type EntityExtractType = v.InferOutput<typeof EntityExtraDefine>;\n\nexport type NodeExtract = EntityExtractType['entity'][number];\n/** 完整的graph节点项 */\nexport const NodePayloadDefine = v.object({\n ...ENTITY_DEFINE.entries,\n kind: v.optional(v.literal('node'), 'node'),\n id: v.string(),\n chunkId: v.string(),\n fileName: v.string(),\n});\n\nexport const NodeItemDefine = v.pipe(\n v.omit(NodePayloadDefine, ['kind']),\n v.transform((data) => ({ ...data, kind: 'node' as const })),\n);\nexport const NodePayloadNewDefine = v.pipe(\n v.object({\n ...v.omit(NodePayloadDefine, ['id']).entries,\n embeddingChunk: v.string(),\n }),\n);\nexport const NodeItemNewDefine = v.pipe(\n v.object({\n ...v.omit(NodePayloadDefine, ['kind', 'id']).entries,\n id: v.optional(NodePayloadDefine.entries.id, () => v4()),\n }),\n v.transform((data) => ({ ...data, kind: 'node' as const })),\n);\nexport type NodeItemType = v.InferInput<typeof NodeItemDefine>;\nexport type NodeItemNewType = v.InferInput<typeof NodeItemNewDefine>;\n\nexport type EdgeExtract = EntityExtractType['entity_relation'][number];\nexport const EdgePayloadDefine = v.object({\n ...ENTITY_RELATION_DEFINE.entries,\n chunkId: v.string(),\n kind: v.optional(v.literal('edge'), 'edge'),\n name: v.string(),\n fileName: v.string(),\n id: v.string(),\n});\nexport const EdgeItemDefine = v.pipe(\n v.omit(EdgePayloadDefine, ['kind', 'name']),\n v.transform((data) => ({\n ...data,\n name: getEdgeName(data.source, data.target),\n kind: 'edge' as const,\n })),\n);\nexport const EdgePayloadNewDefine = v.pipe(\n v.object({\n ...v.omit(EdgePayloadDefine, ['name', 'id']).entries,\n embeddingChunk: v.string(),\n }),\n v.transform((data) => ({\n ...data,\n name: getEdgeName(data.source, data.target),\n })),\n);\nexport const EdgeItemNewDefine = v.pipe(\n v.object({\n ...v.omit(EdgePayloadDefine, ['kind', 'name', 'id']).entries,\n id: v.optional(NodePayloadDefine.entries.id, () => v4()),\n }),\n v.transform((data) => ({\n ...data,\n name: getEdgeName(data.source, data.target),\n kind: 'edge' as const,\n })),\n);\nexport type EdgePayload = v.InferOutput<typeof EdgePayloadDefine>;\nexport type EdgeItemType = v.InferInput<typeof EdgeItemDefine>;\nexport type EdgeItemNewType = v.InferInput<typeof EdgeItemNewDefine>;\nexport type EdgeQueryPayload = EdgePayload & { embeddingChunk: string };\n// export type EdgeAttr = {\n// list: EdgeItem[];\n// };\nexport interface RagExtraKeyword {\n high_level_keywords: string[];\n low_level_keywords: string[];\n}\n\nexport const KnowledgeGraphCreateDefine = v.object({\n fileName: v.string(),\n chunkId: v.string(),\n nodeList: v.optional(v.array(ENTITY_DEFINE), []),\n edgeList: v.optional(v.array(ENTITY_RELATION_DEFINE), []),\n});\n\nexport type KnowledgeGraphItemType = {\n nodes?: NodeItemNewType[];\n edges?: EdgeItemNewType[];\n};\n/** 属性分割,因为有一部分没id的 */\nexport type NodePayload = v.InferOutput<typeof NodePayloadDefine>;\nexport type NodeQueryPayload = NodePayload & { embeddingChunk: string };\nexport type GraphNodeAttr = {\n list: NodePayload[];\n name: string;\n};\nexport type GraphEdgeAttr = {\n list: EdgePayload[];\n name: string;\n source: string;\n target: string;\n};\n\nexport const KeywordPayloadNewDefine = v.pipe(\n v.object({\n kind: v.optional(v.literal('keyword'), 'keyword'),\n keyword: v.string(),\n chunkId: v.string(),\n fileName: v.string(),\n }),\n);\n", "export function getEdgeName(source: string, target: string) {\n return `${source},${target}`;\n}\n", "import { QdrantClientService } from '@shenghuabi/knowledge/qdrant';\nimport { computed, inject, signal, Signal, untracked } from 'static-injector';\nimport { ConfigToken } from '../const';\nimport Graph from 'graphology';\nimport {\n EdgeItemNewDefine,\n EdgeItemNewType,\n EdgeItemType,\n EdgePayload,\n GraphEdgeAttr,\n GraphNodeAttr,\n KnowledgeGraphItemType,\n NodeItemNewDefine,\n NodeItemNewType,\n NodeItemType,\n NodePayload,\n} from './define/define';\nimport { Attributes } from 'graphology-types';\nimport * as v from 'valibot';\nimport { getEdgeName } from './util';\n\nimport { GraphKnowledgeConfigInline } from './define/config';\nimport { LogToken } from '@shenghuabi/knowledge/util';\n// 这个应该持久化,因为图初始化一次很麻烦\nexport class GraphLocalService {\n #qdClient = inject(QdrantClientService);\n #config = inject<Signal<GraphKnowledgeConfigInline>>(ConfigToken);\n #limit = 5000;\n #graph!: Graph<GraphNodeAttr, GraphEdgeAttr, Attributes>;\n #log = inject(LogToken);\n update$ = signal(0);\n graphExport$$ = computed(() => {\n this.update$();\n return this.#graph.export();\n });\n getGraph() {\n return this.#graph;\n }\n loadDataInitGraph$$ = computed(() => {\n this.initGraph();\n return untracked(() => this.loadingData());\n });\n /** 只初始化数据 */\n initGraph() {\n this.#graph = new Graph();\n return this.#graph;\n }\n #getEdgesFromSource(name: string) {\n try {\n return this.#graph.outEdges(name);\n } catch (error) {\n this.#log.warn(error);\n return [];\n }\n }\n #getEdgesFromTarget(name: string) {\n try {\n return this.#graph.inEdges(name);\n } catch (error) {\n this.#log.warn(error);\n return [];\n }\n }\n\n getTargetListFromSource(name: string) {\n return this.#graph.hasNode(name)\n ? this.#getEdgesFromSource(name).flatMap(\n (name) => this.#graph.getTargetAttributes(name).list,\n )\n : [];\n }\n edgeToNode(item: EdgeItemNewType, type: 'source' | 'target') {\n return {\n name: item[type],\n description: item.description,\n type: '未知',\n chunkId: item.chunkId,\n fileName: item.fileName,\n } as NodeItemNewType;\n }\n\n createOrUpdateNodeAttr(item: NodeItemNewType) {\n const payload = v.parse(NodeItemNewDefine, item);\n if (this.#graph.hasNode(payload.name)) {\n const obj = this.#graph.getNodeAttributes(payload.name);\n for (let index = 0; index < obj.list.length; index++) {\n const item = obj.list[index];\n if (item.id === payload.id) {\n obj.list[index] = payload;\n this.#graph.replaceNodeAttributes(payload.name, obj);\n return;\n }\n }\n obj.list.push(payload);\n this.#graph.replaceNodeAttributes(payload.name, obj);\n } else {\n this.#graph.addNode(payload.name, {\n list: [payload],\n name: payload.name,\n });\n }\n }\n // source/target可能不存在,需要临时节点\n createOrUpdateEdgeAttr(item: EdgeItemNewType) {\n const payload = v.parse(EdgeItemNewDefine, item);\n if (this.#graph.hasEdge(payload.name)) {\n const obj = this.#graph.getEdgeAttributes(payload.name);\n for (let index = 0; index < obj.list.length; index++) {\n const item = obj.list[index];\n if (item.id === payload.id) {\n obj.list[index] = payload;\n this.#graph.replaceEdgeAttributes(item.name, obj);\n return;\n }\n }\n obj.list.push(payload);\n this.#graph.replaceEdgeAttributes(payload.name, obj);\n } else {\n if (!this.#graph.hasNode(item.source)) {\n this.#graph.addNode(item.source, {\n list: [v.parse(NodeItemNewDefine, this.edgeToNode(item, 'source'))],\n name: item.source,\n });\n }\n if (!this.#graph.hasNode(item.target)) {\n this.#graph.addNode(item.target, {\n list: [v.parse(NodeItemNewDefine, this.edgeToNode(item, 'target'))],\n name: item.target,\n });\n }\n\n this.#graph.addEdgeWithKey(payload.name, item.source, item.target, {\n list: [payload],\n name: payload.name,\n source: payload.source,\n target: payload.target,\n });\n }\n }\n #deleteNodeAttr(payload: Pick<NodeItemType, 'id' | 'name'>) {\n if (this.#graph.hasNode(payload.name)) {\n const attr = this.#graph.getNodeAttributes(payload.name);\n const index = attr.list.findIndex((item) => item.id === payload.id);\n if (index !== -1) {\n attr.list.splice(index, 1);\n if (attr.list.length === 0) {\n this.#graph.dropNode(payload.name);\n } else {\n this.#graph.replaceNodeAttributes(payload.name, attr);\n }\n }\n }\n }\n\n #deleteEdgeAttr(item: Pick<EdgeItemType, 'id' | 'source' | 'target'>) {\n const name = getEdgeName(item.source, item.target);\n if (!this.#graph.hasEdge(name)) {\n return;\n }\n const attr = this.#graph.getEdgeAttributes(name);\n for (let index = 0; index < attr.list.length; index++) {\n const edgeItem = attr.list[index];\n if (edgeItem.id === item.id) {\n attr.list.splice(index, 1);\n if (attr.list.length === 0) {\n this.#graph.dropEdge(name);\n } else {\n this.#graph.replaceEdgeAttributes(name, attr);\n }\n return;\n }\n }\n }\n #updateGraph(payload: NodePayload | EdgePayload, update?: boolean) {\n if (payload.kind === 'node') {\n this.createOrUpdateNodeAttr(payload);\n } else if (payload.kind === 'edge') {\n this.createOrUpdateEdgeAttr(payload);\n }\n }\n async loadingData() {\n let offset: string | undefined;\n const [nodeList, edgeList] = await Promise.all(\n ['node', 'edge'].map(async (kind) => {\n const nodePoints = [];\n do {\n const { points, next_page_offset } = await this.#qdClient.scroll(\n this.#config().activateGraphName,\n {\n limit: this.#limit,\n filter: {\n must: {\n key: 'kind',\n match: {\n value: kind,\n },\n },\n },\n with_payload: true,\n offset: offset,\n },\n );\n nodePoints.push(() => {\n for (const item of points) {\n this.#updateGraph({ ...item.payload!, id: item.id } as any);\n }\n });\n offset = next_page_offset as any;\n } while (offset);\n return nodePoints;\n }),\n );\n nodeList.forEach((fn) => fn());\n edgeList.forEach((fn) => fn());\n }\n /** 一个节点分多个,需要删除原来的节点和边,然后插入\n * 拆分后的节点有可能是存在的\n */\n async splitNode(options: { node: string; list: string[] }) {\n const nodeAttr = this.#graph.getNodeAttributes(options.node);\n options.list.map((replaceNodeName) => {\n nodeAttr.list.forEach((item) => {\n this.createOrUpdateNodeAttr({ ...item, name: replaceNodeName });\n });\n });\n const sourceEdges = this.#getEdgesFromSource(options.node);\n const targetEdges = this.#getEdgesFromTarget(options.node);\n for (const edge of sourceEdges) {\n const attr = this.#graph.getEdgeAttributes(edge);\n for (const replaceNodeName of options.list) {\n attr.list.forEach((attrItem) => {\n this.createOrUpdateEdgeAttr({ ...attrItem, source: replaceNodeName });\n });\n }\n }\n for (const edge of targetEdges) {\n const attr = this.#graph.getEdgeAttributes(edge);\n for (const replaceNodeName of options.list) {\n attr.list.forEach((attrItem) => {\n this.createOrUpdateEdgeAttr({ ...attrItem, target: replaceNodeName });\n });\n }\n }\n\n this.#graph.dropNode(options.node);\n this.update$.update((a) => a + 1);\n }\n async mergeNode(options: { node: string; list: string[] }) {\n const sourceEdges = options.list.flatMap((item) =>\n this.#getEdgesFromSource(item),\n );\n const targetEdges = options.list.flatMap((item) =>\n this.#getEdgesFromTarget(item),\n );\n // 先插入节点,防止边创建\n options.list.forEach((node) => {\n const attr = this.#graph.getNodeAttributes(node);\n attr.list.forEach((item) => {\n this.createOrUpdateNodeAttr({ ...item, name: options.node });\n });\n });\n for (const edge of sourceEdges) {\n const data = this.#graph.getEdgeAttributes(edge);\n data.list.forEach((item) => {\n this.createOrUpdateEdgeAttr({ ...item, source: options.node });\n });\n }\n for (const edge of targetEdges) {\n const data = this.#graph.getEdgeAttributes(edge);\n data.list.forEach((item) => {\n this.createOrUpdateEdgeAttr({ ...item, target: options.node });\n });\n }\n\n options.list.forEach((item) => {\n this.#graph.dropNode(item);\n });\n this.update$.update((a) => a + 1);\n }\n\n async changeNodeDescription(payload: NodeItemType) {\n this.createOrUpdateNodeAttr(payload);\n this.update$.update((a) => a + 1);\n }\n\n async changeEdge(\n item: EdgeItemType,\n oldItem: Pick<EdgePayload, 'id' | 'source' | 'target'>,\n ) {\n this.createOrUpdateEdgeAttr(item);\n if (item.source !== oldItem.source || item.target !== oldItem.target) {\n this.#deleteEdgeAttr(oldItem);\n }\n this.update$.update((a) => a + 1);\n }\n async add(input: KnowledgeGraphItemType) {\n // 可能添加部分\n input.nodes?.forEach((item) => {\n this.createOrUpdateNodeAttr(item);\n });\n input.edges?.forEach((item) => {\n this.createOrUpdateEdgeAttr(item);\n });\n this.update$.update((a) => a + 1);\n }\n async deleteNodeItem(item: Pick<NodeItemType, 'id' | 'name'>) {\n this.#deleteNodeAttr(item);\n this.update$.update((a) => a + 1);\n }\n deleteEdgeItem(item: Pick<EdgeItemType, 'id' | 'source' | 'target'>) {\n this.#deleteEdgeAttr(item);\n this.update$.update((a) => a + 1);\n }\n deleteNode(name: string) {\n this.#graph.dropNode(name);\n this.update$.update((a) => a + 1);\n }\n /**\n * node=>edge\n * 确定最相似的chunk(第一位)\n * 获取传入节点的所有变\n */\n getEdgeByNode(nodes: NodePayload[]) {\n const repeatList = new Set();\n const list = [];\n for (const node of nodes) {\n for (const edgeName of [\n ...this.#graph.outEdges(node.name),\n ...this.#graph.inEdges(node.name),\n ]) {\n const key = `${edgeName}|${node.chunkId}`;\n if (repeatList.has(key)) {\n continue;\n }\n repeatList.add(key);\n list.push(\n ...this.#graph\n .getEdgeAttributes(edgeName)\n .list.filter((item) => item.chunkId === node.chunkId),\n );\n }\n }\n return list;\n }\n\n /**\n * 根据边查节点\n * 通过边上的chunkid,查找同在这个chunkid上的souce/target节点,权重为边\n */\n getNodeByEdge(edges: EdgePayload[]) {\n const repeatList = new Set();\n const list = [];\n for (const edge of edges) {\n for (const nodeName of [edge.source, edge.target]) {\n const key = `${nodeName}|${edge.chunkId}`;\n if (repeatList.has(key)) {\n continue;\n }\n repeatList.add(key);\n list.push(\n ...this.#graph\n .getNodeAttributes(nodeName)\n .list.filter((item) => item.chunkId === edge.chunkId),\n );\n }\n }\n return list;\n }\n getChunkEdgeByNode(node: Pick<NodeItemType, 'name' | 'chunkId'>) {\n const list = [];\n for (const edgeName of [\n ...this.#graph.outEdges(node.name),\n ...this.#graph.inEdges(node.name),\n ]) {\n const edgeAttr = this.#graph.getEdgeAttributes(edgeName);\n list.push(\n ...edgeAttr.list.filter((item) => node.chunkId === item.chunkId),\n );\n }\n return list;\n }\n}\n", "import { QdrantClientService } from '@shenghuabi/knowledge/qdrant';\nimport { inject, Injector, Signal } from 'static-injector';\nimport { Text2VecToken, ConfigToken } from '../const';\nimport { KnowledgeUtilService } from '../knowledge.util.service';\nimport { v4 } from 'uuid';\nimport {\n NodeItemType,\n KnowledgeGraphItemType,\n EdgeItemType,\n EdgeItemDefine,\n NodeItemDefine,\n NodeItemNewDefine,\n EdgeItemNewDefine,\n} from './define/define';\nimport { getEdgeName } from './util';\nimport * as v from 'valibot';\nimport { GraphKnowledgeConfigInline } from './define/config';\nimport { GraphKnowledgeUtilService } from './graph.util.service';\nimport { isTruthy, LogToken } from '@shenghuabi/knowledge/util';\nconst MAX_LIMIT = 99999;\nconst FilterEdge = {\n key: 'kind',\n match: {\n value: 'edge',\n },\n};\nconst FilterNode = {\n key: 'kind',\n match: {\n value: 'node',\n },\n};\nexport class GraphHandleService {\n #text2vec = inject(Text2VecToken);\n #config = inject<Signal<GraphKnowledgeConfigInline>>(ConfigToken);\n #util = inject(KnowledgeUtilService);\n #qdClient = inject(QdrantClientService);\n #channel = inject(LogToken);\n #injector = inject(Injector);\n #graphUtil = inject(GraphKnowledgeUtilService);\n\n /** 拆分节点\n */\n async splitNode(options: { node: string; list: string[] }) {\n await this.#graphUtil.updateContext(async () => {\n const [{ points: nodes }, { points: edges }] = await Promise.all([\n this.#qdClient.scroll(this.#config().activateGraphName, {\n limit: MAX_LIMIT,\n filter: {\n must: [FilterNode, { key: 'name', match: { value: options.node } }],\n },\n with_payload: true,\n with_vector: false,\n }),\n this.#qdClient.scroll(this.#config().activateGraphName, {\n limit: MAX_LIMIT,\n filter: {\n must: [FilterEdge],\n should: [\n { key: 'source', match: { value: options.node } },\n { key: 'target', match: { value: options.node } },\n ],\n },\n with_payload: true,\n with_vector: false,\n }),\n ]);\n const [updateNodes, updateEdges] = await Promise.all([\n Promise.all(\n nodes.flatMap((node) =>\n options.list.map(async (nodeName) => {\n const payload = { ...node.payload!, name: nodeName } as any;\n return {\n payload: payload,\n id: v4(),\n };\n }),\n ),\n ),\n Promise.all(\n edges.flatMap((edge) =>\n options.list.map(async (nodeName) => {\n const payload =\n edge.payload!['source'] === options.node\n ? ({ ...edge.payload!, source: nodeName } as any)\n : ({ ...edge.payload!, target: nodeName } as any);\n payload['name'] = getEdgeName(\n payload['source'],\n payload['target'],\n );\n return {\n payload: payload,\n id: v4(),\n };\n }),\n ),\n ),\n ]);\n return {\n upsert: {\n nodes: updateNodes,\n edges: updateEdges,\n },\n delete: {\n nodes: nodes,\n edges: edges,\n },\n };\n });\n }\n /** 合并节点 */\n async mergeNode(options: { node: string; list: string[] }) {\n const listToObj = options.list.reduce(\n (obj, item) => {\n obj[item] = true;\n return obj;\n },\n {} as Record<string, boolean>,\n );\n await this.#graphUtil.updateContext(async () => {\n const [{ points: nodes }, { points: edges }] = await Promise.all([\n this.#qdClient.scroll(this.#config().activateGraphName, {\n limit: MAX_LIMIT,\n filter: {\n must: [FilterNode, { key: 'name', match: { any: options.list } }],\n },\n with_payload: true,\n with_vector: false,\n }),\n this.#qdClient.scroll(this.#config().activateGraphName, {\n limit: MAX_LIMIT,\n filter: {\n must: [FilterEdge],\n should: [\n { key: 'source', match: { any: options.list } },\n { key: 'target', match: { any: options.list } },\n ],\n },\n with_payload: true,\n with_vector: false,\n }),\n ]);\n const [updateNodes, updateEdges] = await Promise.all([\n Promise.all(\n nodes.map(async (node) => {\n const payload = { ...node.payload!, name: options.node } as any;\n return {\n payload: payload,\n id: v4(),\n };\n }),\n ),\n Promise.all(\n edges.map(async (edge) => {\n const hasSource = listToObj[edge.payload!['source'] as any];\n const hasTarget = listToObj[edge.payload!['target'] as any];\n if (hasSource && hasTarget) {\n return undefined;\n }\n const payload = hasSource\n ? ({ ...edge.payload!, source: options.node } as any)\n : ({ ...edge.payload!, target: options.node } as any);\n payload['name'] = getEdgeName(payload['source'], payload['target']);\n return {\n payload: payload,\n id: v4(),\n };\n }),\n ).then((list) => list.filter(isTruthy)),\n ]);\n return {\n upsert: {\n nodes: updateNodes,\n edges: updateEdges,\n },\n delete: {\n nodes: nodes,\n edges: edges,\n },\n };\n });\n }\n /** 虽然可以修改其他的,但是只允许修改描述 */\n async changeNodeDescription(item: NodeItemType) {\n const payload = v.parse(NodeItemDefine, item);\n const id = payload.id;\n delete (payload as any).id;\n await this.#graphUtil.updateContext(async () => ({\n upsert: {\n nodes: [\n {\n id,\n payload: payload,\n },\n ],\n },\n }));\n }\n /**\n * 修改边,如果关系修改了不需要改边 */\n async changeEdge(item: EdgeItemType) {\n const id = item.id;\n const payload = v.parse(EdgeItemDefine, item);\n delete (item as any).id;\n\n await this.#graphUtil.updateContext(async () => ({\n upsert: {\n edges: [\n {\n id,\n payload: payload,\n },\n ],\n },\n }));\n }\n /** 可以添加节点/边 */\n async addNodeItem(input: KnowledgeGraphItemType) {\n await this.#graphUtil.updateContext(async () => {\n const nodes = (input.nodes ?? []).map((node) => {\n const payload = v.parse(NodeItemNewDefine, node);\n return {\n id: v4(),\n payload: payload,\n };\n });\n const edges = (input.edges ?? []).map((edge) => {\n const payload = v.parse(EdgeItemNewDefine, edge);\n return {\n id: v4(),\n payload: payload,\n };\n });\n\n return {\n upsert: { nodes, edges },\n };\n });\n }\n /** 删除节点的一条 */\n async deleteNodeItem(item: Pick<NodeItemType, 'id' | 'name'>) {\n await this.#graphUtil.updateContext(async () => {\n const { points } = await this.#qdClient.scroll(\n this.#config().activateGraphName,\n {\n limit: 1,\n filter: {\n must: [FilterNode, { key: 'name', match: { value: item.name } }],\n },\n },\n );\n\n return {\n delete: {\n nodes: [item],\n edges:\n points.length === 1\n ? {\n filter: {\n must: [FilterEdge],\n should: [\n { key: 'source', match: { value: item.name } },\n { key: 'target', match: { value: item.name } },\n ],\n },\n }\n : [],\n },\n };\n });\n }\n /** 删除整个边(边不影响节点) */\n async deleteEdge(item: Pick<EdgeItemType, 'id' | 'source' | 'target'>) {\n await this.#graphUtil.updateContext(async () => ({\n delete: {\n edges: [item],\n },\n }));\n }\n /** 删除整个节点(对应边也删除) */\n async deleteNodeByName(name: string) {\n await this.#graphUtil.updateContext(async () => ({\n delete: {\n nodes: {\n filter: {\n must: [FilterNode, { key: 'name', match: { value: name } }],\n should: null,\n },\n },\n edges: {\n filter: {\n must: [FilterEdge],\n should: [\n { key: 'source', match: { value: name } },\n { key: 'target', match: { value: name } },\n ],\n },\n },\n },\n }));\n }\n}\n", "import { createInjector, inject, Injector } from 'static-injector';\nimport { GraphLocalService } from './graph.local.service';\nimport { GraphKnolwdgeService } from './graph.knowledge.service';\nimport { GraphHandleService } from './graph.handle.service';\nimport { GraphSplitNodeInput } from './type';\nimport {\n EdgeItemType,\n EdgePayload,\n KnowledgeGraphItemType,\n NodeItemType,\n} from './define/define';\nimport { GraphQueryService } from './graph.query.service';\nimport { QueryParams, QueryParamsToken } from './const';\n\nexport class GraphService {\n local = inject(GraphLocalService);\n #knowledge = inject(GraphHandleService);\n knowledge = inject(GraphKnolwdgeService);\n #injector = inject(Injector);\n graphExport$$ = this.local.graphExport$$;\n createQuery(queryParams: QueryParams) {\n return createInjector({\n providers: [\n GraphQueryService,\n { provide: QueryParamsToken, useValue: queryParams },\n ],\n parent: this.#injector,\n }).get(GraphQueryService);\n }\n loadDataInit$$ = this.local.loadDataInitGraph$$;\n initGraph() {\n return this.local.initGraph();\n }\n getGraph() {\n return this.local.getGraph();\n }\n async splitNode(options: GraphSplitNodeInput) {\n await this.local.splitNode(options);\n await this.#knowledge.splitNode(options);\n }\n async mergeNode(options: GraphSplitNodeInput) {\n await this.local.mergeNode(options);\n await this.#knowledge.mergeNode(options);\n }\n async changeNodeDescription(item: NodeItemType) {\n await this.local.changeNodeDescription(item);\n await this.#knowledge.changeNodeDescription(item);\n }\n async changeEdge(\n item: EdgeItemType,\n oldItem: Pick<EdgePayload, 'id' | 'source' | 'target'>,\n ) {\n await this.local.changeEdge(item, oldItem);\n await this.#knowledge.changeEdge(item);\n }\n async add(input: KnowledgeGraphItemType) {\n await this.local.add(input);\n await this.#knowledge.addNodeItem(input);\n }\n async deleteNodeItem(item: Pick<NodeItemType, 'id' | 'name'>) {\n await this.local.deleteNodeItem(item);\n await this.#knowledge.deleteNodeItem(item);\n }\n async deleteEdge(item: Pick<EdgeItemType, 'id' | 'source' | 'target'>) {\n await this.local.deleteEdgeItem(item);\n await this.#knowledge.deleteEdge(item);\n }\n async deleteNodeByName(name: string) {\n await this.local.deleteNode(name);\n await this.#knowledge.deleteNodeByName(name);\n }\n}\n", "import { QdrantClientService } from '@shenghuabi/knowledge/qdrant';\nimport { inject, Signal } from 'static-injector';\nimport { QueryContext } from './type';\nimport { ConfigToken, ReRankerToken, Text2VecToken } from '../const';\nimport { GraphLocalService } from './graph.local.service';\nimport { QueryParamsToken } from './const';\nimport { differenceBy, uniqBy } from 'lodash-es';\nimport { getEdgeStrList, getNodeStrList } from './util/graph-util';\nimport {\n formatEdgeAttr2,\n FormatGraphEdgeAttr,\n FormatGraphNodeAttr,\n formatNodeAttr2,\n} from './util/format-attr';\nimport { FileChunkPayload } from '../common/define/chunk';\nimport { GraphKnowledgeConfigInline } from './define/config';\nimport { GraphRelationQueryDefine } from './define/query';\nimport * as v from 'valibot';\nimport { EdgeQueryPayload, NodeQueryPayload } from './define';\nexport class GraphQueryService {\n #qdClient = inject(QdrantClientService);\n #config = inject<Signal<GraphKnowledgeConfigInline>>(ConfigToken);\n #graphChange = inject(GraphLocalService);\n #queryParams = inject(QueryParamsToken);\n #text2vec = inject(Text2VecToken);\n #reranker = inject(ReRankerToken);\n\n /** 返回限制索引 */\n #listLimit<T>(\n list: T[],\n strListFn: (list: T, index: number) => string,\n limit: number,\n ) {\n let count = 0;\n const strList = list.map(strListFn);\n for (let i = 0; i < strList.length; i++) {\n const str = strList[i];\n count += str.length;\n if (count > limit) {\n return list.slice(0, i);\n }\n }\n return list;\n }\n #contextLimit<\n T extends { nodes: any[]; edges: any[]; chunks: FileChunkPayload[] },\n >(context: T): T {\n return {\n nodes: this.#listLimit(\n context.nodes,\n (item: any, i) => getNodeStrList(item, i).join('|'),\n this.#queryParams.lengthLimit.node,\n ),\n edges: this.#listLimit(\n context.edges,\n (item: any, i) => getEdgeStrList(item, i).join('|'),\n this.#queryParams.lengthLimit.edge,\n ),\n chunks: this.#listLimit(\n context.chunks,\n (list) => list.chunk,\n this.#queryParams.lengthLimit.chunk,\n ),\n } as any;\n }\n async #queryGraphCollection<T>(content: string, kind: 'node' | 'edge') {\n return this.#qdClient\n .search(this.#config().activateGraphName, {\n limit: this.#queryParams.topK * this.#reranker.getQueryRatio(),\n vector: {\n name: 'chunk',\n vector: await this.#text2vec(\n content,\n this.#config().activateCollection,\n ),\n },\n filter: {\n must: {\n key: 'kind',\n match: {\n value: kind,\n },\n },\n },\n with_payload: true,\n // with_lookup: true,\n })\n .then((item) =>\n item.map((item) => ({ ...item.payload, id: item.id }) as T),\n );\n }\n\n async #findChunkDataById(ids: string[]) {\n return this.#qdClient\n .retrieve(this.#config().activateName, { ids: ids, with_payload: true })\n .then((item) =>\n item.map(\n (item) =>\n ({\n ...item.payload,\n knowledge: this.#config().name,\n }) as any as FileChunkPayload,\n ),\n );\n }\n #getEdgeByNode(nodes: NodeQueryPayload[]) {\n const list = this.#graphChange.getEdgeByNode(nodes);\n return this.#qdClient\n .retrieve(this.#config().activateGraphName, {\n ids: list.map((item) => item.id),\n })\n .then((list) =>\n list.map(\n (item) => ({ ...item.payload, id: item.id }) as EdgeQueryPayload,\n ),\n );\n }\n #getNodeByEdge(edges: EdgeQueryPayload[]) {\n const list = this.#graphChange.getNodeByEdge(edges);\n return this.#qdClient\n .retrieve(this.#config().activateGraphName, {\n ids: list.map((item) => item.id),\n })\n .then((list) =>\n list.map(\n (item) => ({ ...item.payload, id: item.id }) as NodeQueryPayload,\n ),\n );\n }\n async #queryLocal(keywords: string) {\n /** 查询返回的节点组 */\n const nodeGroupResult = await this.#queryGraphCollection<NodeQueryPayload>(\n keywords,\n 'node',\n );\n const chunkResult = await this.#findChunkDataById(\n nodeGroupResult.map((item) => item.chunkId),\n );\n\n return {\n nodes: nodeGroupResult,\n edges: await this.#getEdgeByNode(nodeGroupResult),\n chunks: chunkResult,\n };\n }\n async #queryGlobal(keywords: string) {\n /** 查询返回的边组 */\n const edgeGroupResult = await this.#queryGraphCollection<EdgeQueryPayload>(\n keywords,\n 'edge',\n );\n const chunkResult = await this.#findChunkDataById(\n edgeGroupResult.map((item) => item!['chunkId']),\n );\n\n return {\n nodes: await this.#getNodeByEdge(edgeGroupResult),\n edges: edgeGroupResult,\n chunks: chunkResult,\n };\n }\n async query(params: { node?: string; edge?: string }, question: string) {\n params = v.parse(GraphRelationQueryDefine, params);\n\n await this.#graphChange.loadDataInitGraph$$();\n\n let context: QueryContext;\n if (params.node && params.edge) {\n const context1 = await this.#queryLocal(params.node!);\n const context2 = await this.#queryGlobal(params.edge!);\n // 先合并,然后在排序,然后在截取\n const ctx2NodeExtra = differenceBy(\n context2.nodes,\n context1.nodes,\n (item) => item.id,\n );\n\n const ctx1EdgeExtra = differenceBy(\n context1.edges,\n context2.edges,\n (item) => item.id,\n );\n\n // 其实可以保留前20%的结果,后80%排序\n context = {\n nodes: [...context1.nodes, ...ctx2NodeExtra],\n edges: [...context2.edges, ...ctx1EdgeExtra],\n chunks: uniqBy(\n [...context1.chunks, ...context2.chunks],\n (a) => a.chunk,\n ),\n };\n } else if (params.node) {\n context = await this.#queryLocal(params.node!);\n } else if (params.edge) {\n context = await this.#queryGlobal(params.edge!);\n } else {\n throw new Error('');\n }\n const nodeSortedList = await this.#reranker.run({\n value: question,\n docs: context.nodes.map((item) => item.embeddingChunk),\n });\n const nodeSorted = nodeSortedList\n .slice(0, Math.ceil(nodeSortedList.length * 0.3))\n .reduce(\n (obj, item) => {\n const data = context.nodes[item.index];\n obj[data.name] ??= [];\n obj[data.name].push({ data, score: item.score });\n return obj;\n },\n {} as Record<string, { data: NodeQueryPayload; score: number }[]>,\n );\n\n const edgeSortList = await this.#reranker.run({\n value: question,\n docs: context.edges.map((item) => item.embeddingChunk),\n });\n const edgeSorted = edgeSortList\n .slice(0, Math.ceil(nodeSortedList.length * 0.3))\n .reduce(\n (obj, item) => {\n const data = context.edges[item.index];\n obj[data.name] ??= [];\n obj[data.name].push({ data, score: item.score });\n return obj;\n },\n {} as Record<string, { data: EdgeQueryPayload; score: number }[]>,\n );\n\n return this.#contextLimit({\n nodes: Object.values(nodeSorted)\n .reduce((allList: FormatGraphNodeAttr[], list) => {\n let length = 0;\n const index = list.findIndex((value, index) => {\n length += value.data.description.length;\n return length > this.#queryParams.lengthLimit.nodeDescription;\n });\n allList.push(\n formatNodeAttr2(list.slice(0, index == -1 ? list.length : index)),\n );\n return allList;\n }, [])\n .sort((a, b) => b.degree - a.degree),\n edges: Object.values(edgeSorted)\n .reduce((allList, list) => {\n let length = 0;\n const index = list.findIndex((value) => {\n length += value.data.description.length;\n return length > this.#queryParams.lengthLimit.nodeDescription;\n });\n allList.push(\n formatEdgeAttr2(list.slice(0, index == -1 ? list.length : index)),\n );\n return allList;\n }, [] as FormatGraphEdgeAttr[])\n .sort((a, b) => b.degree - a.degree),\n chunks: (\n await this.#reranker.run({\n value: question,\n docs: context.chunks.map((item) => item.embeddingChunk),\n })\n ).map((item) => context.chunks[item.index]),\n });\n }\n\n async searchNode(str: string, selectedList: string[]) {\n await this.#graphChange.loadDataInitGraph$$();\n\n const limit = 20;\n const list: string[] = [];\n // todo trie?\n for (const nodeName of this.#graphChange.getGraph().nodes()) {\n if (!selectedList.includes(nodeName) && nodeName.includes(str)) {\n list.push(nodeName);\n if (limit === list.length) {\n return list;\n }\n }\n }\n\n return list;\n }\n\n async getFileNameList() {\n const result = await this.#qdClient.queryGroups(\n this.#config().activateName,\n {\n limit: 9999,\n group_by: 'fileName',\n group_size: 1,\n with_payload: [],\n },\n );\n return result.groups;\n }\n async getChunkContent(fileName: string) {\n const { points } = await this.#qdClient.query(this.#config().activateName, {\n limit: 9999,\n filter: {\n must: {\n key: 'fileName',\n match: { value: fileName },\n },\n },\n with_payload: true,\n });\n\n return points.map((item) => ({\n ...item,\n payload: {\n ...item.payload,\n knowledge: this.#config().name,\n } as FileChunkPayload & { knowledge: string },\n }));\n }\n\n async getGraphData() {\n await this.#graphChange.loadDataInitGraph$$();\n return this.#graphChange.getGraph().export();\n }\n\n async queryNode(list: string[], options: { nodeSizeLimit: number }) {\n return this.#qdClient\n .scroll(this.#config().activateGraphName, {\n limit: options.nodeSizeLimit,\n filter: {\n must: [\n {\n key: 'kind',\n match: {\n value: 'node',\n },\n },\n {\n key: 'name',\n match: {\n any: list,\n },\n },\n ],\n },\n with_payload: true,\n // with_lookup: true,\n })\n .then((item) => item.points);\n }\n\n async fuzzyQueryNode(\n content: string,\n options: {\n /** 限制多少个节点 */\n nodeLimit: number;\n /** 精度 */\n score: number;\n /** 限制每个节点多少信息 */\n nodeSizeLimit: number;\n },\n ) {\n return this.#qdClient\n .searchPointGroups(this.#config().activateGraphName, {\n limit: options.nodeLimit,\n score_threshold: options.score,\n vector: {\n name: 'chunk',\n vector: await this.#text2vec(\n content,\n this.#config().activateCollection,\n ),\n },\n group_by: 'name',\n group_size: options.nodeSizeLimit,\n filter: {\n must: {\n key: 'kind',\n match: {\n value: 'node',\n },\n },\n },\n with_payload: true,\n // with_lookup: true,\n })\n .then((item) => item.groups);\n }\n}\n", "import { QueryGraphEdgeAttr, QueryGraphNodeAttr } from './format-attr';\n\n/** 用来计算权重 */\nexport function sigmoid(z: number) {\n return 1 / (1 + Math.exp(-z));\n}\n\nexport function getNodeStrList(item: QueryGraphNodeAttr, index: number) {\n return [\n index + 1,\n item.name,\n item.type,\n item.list.map((item) => item.description).join(';'),\n (item.degree * 100).toFixed(0),\n ];\n}\nexport function getEdgeStrList(item: QueryGraphEdgeAttr, i: number) {\n return [\n i + 1,\n item.source,\n item.target,\n item.list.map((item) => item.description).join(';'),\n (item.degree * 100).toFixed(0),\n ];\n}\n", "import * as v from 'valibot';\nimport {\n EdgePayloadDefine,\n GraphNodeAttr,\n NodePayloadDefine,\n} from '../define/define';\nimport { countBy, maxBy } from 'lodash-es';\n\nexport function getNodeType(list: GraphNodeAttr['list']) {\n const data = countBy(list, (item) => item.type);\n delete data['未知'];\n return maxBy(Object.entries(data), (a) => a[1])?.[0] ?? '未知';\n}\n\nexport function formatNodeAttr2(list: { data: any; score: number }[]) {\n let allCount = 0;\n const attrList = list.map(({ data, score }) => {\n allCount += score;\n return v.parse(NodePayloadDefine, data);\n });\n const score = allCount / list.length;\n const data = countBy(attrList, (item) => item.type);\n delete data['未知'];\n const type = getNodeType(attrList);\n attrList.forEach((item) => {\n item.type = type;\n });\n return {\n list: attrList,\n name: attrList[0].name,\n type: getNodeType(attrList),\n degree: score,\n };\n}\n\nexport type FormatGraphNodeAttr = ReturnType<typeof formatNodeAttr2>;\nexport type QueryGraphNodeAttr = FormatGraphNodeAttr & { degree: number };\n\nexport function formatEdgeAttr2(list: { data: any; score: number }[]) {\n let allCount = 0;\n\n const attrList = list.map(({ data, score }) => {\n allCount += score;\n\n return v.parse(EdgePayloadDefine, data);\n });\n const score = allCount / list.length;\n\n return {\n list: attrList,\n name: attrList[0].name,\n source: attrList[0].source,\n target: attrList[0].target,\n degree: score,\n };\n}\nexport type FormatGraphEdgeAttr = ReturnType<typeof formatEdgeAttr2>;\nexport type QueryGraphEdgeAttr = FormatGraphEdgeAttr & { degree: number };\n", "import * as v from 'valibot';\nexport const GraphRelationQueryDefine = v.pipe(\n v.object({\n node: v.optional(v.string()),\n edge: v.optional(v.string()),\n }),\n v.forward(\n v.partialCheck(\n [['node'], ['edge']],\n (input) =>\n typeof input.node === 'string' || typeof input.edge === 'string',\n '节点或边必须存在一个',\n ),\n ['node'],\n ),\n);\n", "import { getHash } from '@shenghuabi/knowledge/util';\nimport {\n ConfigToken,\n DirToken,\n NormalKnowledgeConfigInline,\n NormalKnowledgeService,\n ReRankerToken,\n Text2VecToken,\n} from '..';\nimport { createNormalizeVfs, path } from '@cyia/vfs2';\nimport { computed, inject, Signal } from 'static-injector';\nimport { QdrantClientService } from '@shenghuabi/knowledge/qdrant';\nimport { FilterOptions, QueryOptions } from '../common/query';\nimport { KnowledgeUtilService } from '../knowledge.util.service';\nimport { ArticleCollectionInlineType } from './define';\nimport { promise as fastq } from 'fastq';\nimport { ArticlePayload, ArticlePayloadType } from './define/payload';\nimport * as v from 'valibot';\nexport class ArticleKnowledgeService extends NormalKnowledgeService {\n #text2vec = inject(Text2VecToken);\n #reranker = inject(ReRankerToken);\n #config = inject<Signal<NormalKnowledgeConfigInline>>(ConfigToken);\n #dir = inject(DirToken);\n #qdClient = inject(QdrantClientService);\n #util = inject(KnowledgeUtilService);\n #vfs = computed(() => createNormalizeVfs({ dir: this.#dir() }));\n\n protected override KeyWordIndex = ['fullName', 'dir', 'fileHash'];\n protected override getPayload(fileName: string, content: string) {\n return {\n fileHash: getHash(content),\n fullName: fileName,\n name: path.basename(fileName),\n dir: path.dirname(fileName),\n };\n }\n override async insertItem(fileName: string, content: string): Promise<void> {\n const { points } = await this.#qdClient.scroll(\n this.#config().activateName,\n {\n limit: 1,\n filter: {\n should: [\n { key: 'fileHash', match: { value: getHash(content) } },\n { key: 'fullName', match: { value: fileName } },\n ],\n },\n },\n );\n if (points.length) {\n return;\n }\n // 不需要生成实体文件,\n await this.insertItemOnly(fileName, content, this.#config().collectionList);\n }\n override async deleteItem(fileName: string) {\n await this.#util.multiDelete(\n this.#config().collectionList.map((item) => item.collectionName),\n {\n filter: {\n must: [{ key: 'fullName', match: { value: fileName } }],\n should: null,\n },\n },\n );\n }\n override async addCollection(collection: ArticleCollectionInlineType) {\n /** 保存文件,新创建的没有 */\n\n await this.createCollection(collection);\n\n try {\n const queue = fastq(async (payload: ArticlePayloadType) => {\n payload = v.parse(ArticlePayload, payload);\n\n const content = await this.#vfs().readContent(payload.fullName);\n if (!content) {\n return;\n }\n await this.insertItemOnly(payload.fullName, content, [collection]);\n }, 10);\n\n let offset: any;\n const wordSet = new Set<string>();\n let queueError;\n queue.error((error) => {\n if (error) {\n queueError = error;\n queue.killAndDrain();\n }\n });\n do {\n const { points, next_page_offset } = await this.#qdClient.scroll(\n this.#config().activateName,\n {\n limit: 5000,\n with_payload: true,\n offset: offset,\n },\n );\n for (const point of points) {\n // 跳过已存在的词条(因为没用实体文件,所以是需要id标记)\n const id = `${point.payload!['fileHash']}`;\n if (wordSet.has(id)) {\n continue;\n }\n wordSet.add(id);\n queue.push(point.payload as any);\n }\n offset = next_page_offset;\n } while (offset);\n await queue.drained();\n if (queueError) {\n throw queueError;\n }\n } catch (error) {\n await this.#qdClient.deleteCollection(collection.collectionName);\n throw error;\n }\n\n await this.#qdClient.setActivateCollection(\n collection.collectionName,\n this.#config().activateName,\n );\n }\n\n override destroy(): Promise<void> {\n return this.#util.destroyKnowledge(\n this.#config().collectionList.map(({ collectionName }) => collectionName),\n );\n }\n\n async searchGroupByChunk(\n text: string,\n options: QueryOptions & {\n group_size: number;\n limit: number;\n },\n filter?: FilterOptions,\n ) {\n const queryResult = await this.#qdClient.searchPointGroups(\n this.#config().activateName,\n {\n group_by: 'hash',\n filter,\n with_payload: true,\n with_vector: false,\n score_threshold: options?.score,\n vector: {\n name: 'chunk',\n vector: await this.#text2vec(text, this.#config().activateCollection),\n },\n group_size: options.group_size * this.#reranker.getQueryRatio(),\n limit: options.limit!,\n },\n );\n\n return Promise.all(\n queryResult.groups.map(async (item) => {\n const resultList = await this.#reranker.run({\n value: text,\n docs: item.hits.map(\n (item) => item.payload?.['embeddingChunk']! as string,\n ),\n });\n return {\n ...item,\n hits: resultList\n .slice(0, options.group_size)\n .map(({ index }) => item.hits[index]),\n };\n }),\n );\n }\n}\n", "import * as v from 'valibot';\nexport const ArticlePayload = v.object({\n fileHash: v.string(),\n fullName: v.string(),\n name: v.string(),\n dir: v.string(),\n chunk: v.string(),\n hash: v.string(),\n loc: v.custom<{ lines: { from: number; to: number } }>(Boolean),\n});\nexport type ArticlePayloadType = v.InferOutput<typeof ArticlePayload>;\n", "import * as v from 'valibot';\nimport { EmbeddingTemplateDefine } from '../../common/define/embedding';\nimport { BaseKnowledgeConfig } from '../../common/define/base';\nimport { getActivateCollectionName } from '../../const';\nexport const ArticleCollectionDefine = v.object({\n collectionName: v.string(),\n embeddingTemplate: v.optional(\n v.object({\n entry: v.optional(EmbeddingTemplateDefine),\n }),\n ),\n size: v.number(),\n});\n\nexport const ArticleKnowledgeConfigDefine = v.pipe(\n v.object({\n ...BaseKnowledgeConfig.entries,\n type: v.optional(v.literal('article'), 'article'),\n collectionList: v.array(ArticleCollectionDefine),\n }),\n v.transform((item) => ({\n ...item,\n /** 激活的普通知识库(文件切片) */\n activateName: getActivateCollectionName(item.name),\n })),\n);\n\nexport type ArticleKnowledgeConfig = v.InferInput<\n typeof ArticleKnowledgeConfigDefine\n>;\nexport type ArticleKnowledgeConfigInline = v.InferOutput<\n typeof ArticleKnowledgeConfigDefine\n>;\nexport type ArticleCollectionInput = v.InferInput<\n typeof ArticleCollectionDefine\n>;\nexport type ArticleCollectionInlineType = v.InferOutput<\n typeof ArticleCollectionDefine\n>;\n", "import * as v from 'valibot';\nexport const FileChunkPayloadDefine = v.object({\n chunk: v.string(),\n fileName: v.string(),\n loc: v.custom<{ lines: { from: number; to: number } }>(Boolean),\n hash: v.string(),\n embeddingChunk: v.string(),\n});\nexport type FileChunkPayload = v.InferOutput<typeof FileChunkPayloadDefine>;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["createInjector", "inject", "Injector", "RootStaticInjectOptions", "inject", "QdrantClientService", "v4", "fastq", "CacheQueue", "v", "v", "v", "v", "inject", "QdrantClientService", "inject", "inject", "QdrantClientService", "CacheQueue", "fastq", "item", "v4", "inject", "QdrantClientService", "LogToken", "fastq", "InjectionToken", "v4", "QdrantClientService", "computed", "inject", "createNormalizeVfs", "fastq", "isTruthy", "LogToken", "v", "inject", "QdrantClientService", "LogToken", "computed", "createNormalizeVfs", "isTruthy", "signal", "fastq", "v", "v", "runInEmbeddingContext", "inject", "QdrantClientService", "v", "v4", "item", "v", "inject", "QdrantClientService", "runInEmbeddingContext", "QdrantClientService", "computed", "inject", "v", "LogToken", "inject", "QdrantClientService", "computed", "name", "item", "BatchQueue", "inject", "QdrantClientService", "LogToken", "signal", "fastq", "v4", "QdrantClientService", "inject", "Injector", "v4", "v", "isTruthy", "LogToken", "inject", "QdrantClientService", "Injector", "v4", "inject", "Injector", "QdrantClientService", "inject", "uniqBy", "item", "v", "data", "score", "v", "v", "inject", "QdrantClientService", "item", "list", "uniqBy", "index", "inject", "Injector", "path", "getHash", "createNormalizeVfs", "path", "computed", "inject", "QdrantClientService", "fastq", "v", "v", "inject", "QdrantClientService", "computed", "createNormalizeVfs", "getHash", "path", "fastq", "item", "v", "QdrantClientService", "LogToken", "RootStaticInjectOptions", "inject", "Injector", "createInjector", "signal", "content", "path", "v"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ImageRawBase } from '@gutenye/ocr-common';
|
|
2
|
+
import type { ImageRawData, LineImage, SizeOption } from '@gutenye/ocr-common';
|
|
3
|
+
import sharp from 'sharp';
|
|
4
|
+
export declare class ImageRaw extends ImageRawBase {
|
|
5
|
+
#private;
|
|
6
|
+
static open(path: string): Promise<ImageRaw>;
|
|
7
|
+
constructor(imageRawData: ImageRawData);
|
|
8
|
+
write(path: string): Promise<sharp.OutputInfo>;
|
|
9
|
+
resize(size: SizeOption): Promise<this>;
|
|
10
|
+
drawBox(lineImages: LineImage[]): Promise<this>;
|
|
11
|
+
}
|
package/ocr/index.d.ts
ADDED
package/ocr/ocr.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import BaseOcr, { ModelCreateOptions } from '@gutenye/ocr-common';
|
|
2
|
+
import * as v from 'valibot';
|
|
3
|
+
declare const ImageAdjustDefine: v.ObjectSchema<{
|
|
4
|
+
readonly padding: v.SchemaWithPipe<readonly [v.OptionalSchema<v.UnionSchema<[v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.TransformAction<number, {
|
|
5
|
+
top: number;
|
|
6
|
+
left: number;
|
|
7
|
+
right: number;
|
|
8
|
+
bottom: number;
|
|
9
|
+
}>]>, v.ObjectSchema<{
|
|
10
|
+
readonly left: v.NumberSchema<undefined>;
|
|
11
|
+
readonly right: v.NumberSchema<undefined>;
|
|
12
|
+
readonly top: v.NumberSchema<undefined>;
|
|
13
|
+
readonly bottom: v.NumberSchema<undefined>;
|
|
14
|
+
}, undefined>], undefined>, {
|
|
15
|
+
readonly top: 50;
|
|
16
|
+
readonly right: 50;
|
|
17
|
+
readonly left: 50;
|
|
18
|
+
readonly bottom: 50;
|
|
19
|
+
}>]>;
|
|
20
|
+
readonly maxSideLen: v.OptionalSchema<v.UnionSchema<[v.SchemaWithPipe<readonly [v.NumberSchema<undefined>]>], undefined>, 1920>;
|
|
21
|
+
}, undefined>;
|
|
22
|
+
export type ImageAdjustType = v.InferInput<typeof ImageAdjustDefine>;
|
|
23
|
+
declare function convert(this: BaseOcr, input: string | Uint8Array, options?: ImageAdjustType): Promise<import("@gutenye/ocr-common").Line[]>;
|
|
24
|
+
export declare class Ocr extends BaseOcr {
|
|
25
|
+
static create(options?: ModelCreateOptions): Promise<BaseOcr & {
|
|
26
|
+
convert: typeof convert;
|
|
27
|
+
}>;
|
|
28
|
+
}
|
|
29
|
+
export {};
|